避免Block中的强引用循环,我可以简单地这样做吗



我正在读这本书,上面写着:为了打破强引用循环,您在块外声明一个指向self的__weak指针。然后你可以在块内使用这个指针,而不是自己:

__weak BNREmployee *weakSelf = self; // a weak reference
myBlock = ^{
    NSLog(@"Employee: %@", weakSelf);
};

块对BNREemployee实例的引用现在是弱引用,并且强引用循环被打破。但是,由于引用较弱,因此在执行块时可能会释放自身指向的对象。您可以通过在区块内创建对自身的强本地引用来消除这种风险:

__weak BNREmployee *weakSelf = self; // a weak reference
myBlock = ^{
    BNREmployee *innerSelf = weakSelf; // a block-local strong reference
    NSLog(@"Employee: %@", innerSelf);
};

为什么我不能简单地做以下事情?

myBlock = ^{
    BNREmployee *innerSelf = self; // a block-local strong reference
    NSLog(@"Employee: %@", innerSelf);
};

BNREmployee *strongSelf = self; 
myBlock = ^{
    BNREmployee *innerSelf = strongSelf; // a block-local strong reference
    NSLog(@"Employee: %@", innerSelf);
};

您的替换块直接引用self,因此只要块存在,ARC就会保留self。如果块由同一对象的特性保留,则存在保留循环。

相关内容

最新更新