繁体   English   中英

避免在Block中建立强大的参考周期,我可以简单地做到这一点

[英]Avoid strong reference cycle in Block, can I simply do this

我正在阅读这本书,它说:要打破强大的参考周期,您可以在指向self的块外声明一个__weak指针。 然后,您可以在块内使用此指针而不是self:

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

现在,该块对BNREmployee实例的引用是一个弱引用,并且强引用循环已中断。 但是,由于引用比较弱,因此在块执行期间可以将自身指向的对象释放。 您可以通过在块内创建对self的强大本地引用来消除这种风险:

__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 如果该块是由同一对象的属性保留的,则将具有一个保留循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM