1

为什么当我们将弱引用传递给块内的强引用时它会起作用?如果块中的局部变量被保留,这应该添加一个保留self,从而创建这个糟糕的保留循环?

这是示例:

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

2 回答 2

3

当您创建或复制一个块时(例如,它可以在您将其调度到 gcd 时被复制),引用的变量将被捕获(除非使用 __block 说明符声明)。保留强引用,不保留弱引用。

当您创建局部变量时,它在块执行strongSelf时保持活动状态(即,当它未执行并且位于属性中时,没有强引用)。当您直接引用时 -被捕获并保留,现在它会保留while block is aliveselfselfselfself

__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引用杀死所有指向对象的强指针,块内仍然有一个强引用,即被捕获并保留的那个。同时本地指针只持有对while 块执行的strongSelf强引用,因此,如果已经死亡,则为nil并将获得 nil 值。selfselfweakSelfstrongSelf

于 2014-11-11T15:38:07.717 回答
1

不,它不会产生循环,因为 self 没有被捕获得那么强!:)

strongSelf 是一个保留自我的强引用,但是因为strongSelf 是一个本地变量,它在块完成并且保留计数下降时释放

于 2014-11-11T15:26:24.090 回答