块中具有强引用的弱变量:不会创建保留周期?

时间:2014-11-11 14:56:31

标签: ios objective-c retain-cycle

为什么当我们将弱引用传递给块内的强引用时它会起作用?如果保留块中的局部变量,这应该为self添加一个保留,从而产生这个错误的保留周期?

以下是示例:

__weak id weakSelf = self; 
[self.operationQueue addOperationWithBlock:^{
    NSNumber* result = findLargestMersennePrime();
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
        MyClass* strongSelf = weakSelf; 
        strongSelf.textLabel.text = [result stringValue];
    }]; 
}];

2 个答案:

答案 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是一个局部变量,它在块完成时释放并且保留计数下降