为什么当我们将弱引用传递给块内的强引用时它会起作用?如果保留块中的局部变量,这应该为self
添加一个保留,从而产生这个错误的保留周期?
以下是示例:
__weak id weakSelf = self;
[self.operationQueue addOperationWithBlock:^{
NSNumber* result = findLargestMersennePrime();
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
MyClass* strongSelf = weakSelf;
strongSelf.textLabel.text = [result stringValue];
}];
}];
答案 0 :(得分:3)
当您创建或复制块(例如,可以将其复制到gcd时复制)时,将捕获引用的变量(除非使用__block说明符声明)。保留强引用,弱引用不保留。
当您创建本地strongSelf
变量时,它会使self
保持活动状态,而阻止执行(即,当它未被执行并且位于其中的属性中时,'没有强烈的参考)。当您直接引用self
时,系统会抓取并保留self
,现在它会在阻止活着时保持self
。
__weak id weakSelf = self;
[self.operationQueue addOperationWithBlock:^{
NSNumber* result = findLargestMersennePrime();
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
MyClass* strongSelf = weakSelf; // strong reference when block executes
[self foo]; // strong reference when block created/copied
strongSelf.textLabel.text = [result stringValue];
}];
}];
看到区别?如果你使用直接self
引用杀死所有强对象指针,那么在块内部仍然有一个强引用,即被捕获并保留的引用。同时,当执行块时,本地strongSelf
指针仅保留对self
的强引用,因此,如果self
已经死亡,则weakSelf
将为零并且{{1将获得零值。
答案 1 :(得分:1)
不,它不会创建一个循环,因为自我没有被捕获为强大! :)
strongSelf是一个强大的参考,保留自我但由于strongSelf是一个局部变量,它在块完成时释放并且保留计数下降