为什么在block中需要使用weak self?

13 浏览
0 Comments

为什么在block中需要使用weak self?

就像下面的代码一样:

__weak typeof(self) weakSelf = self;
[self methodThatTakesABlock:^ {
    [weakSelf doSomething];
    //[self doSomething];//为什么不是这一行?
}];

0
0 Comments

为什么在block中需要使用weak self?

在上述代码中,如果completion block被存储在self中,那么这段代码不会导致retain cycle。如果completion block是一个属性,那么self将会对block有一个strong引用,而block也会对self有一个strong引用,这就导致了retain cycle的产生。这就是为什么在这种情况下需要使用weak self来避免retain cycle的产生。但需要注意的是,只有在block被存储为self的属性或者成员变量时才需要使用weak self。

如果completion block只在methodThatTakesABlock中被调用,那么就不需要使用weak self,因为block不会被retain。在这种情况下,block对self有一个strong引用,但self对block没有引用,所以不会产生retain cycle。

这并不是唯一会导致在block中使用strong self时产生retain cycle的情况。

0