[英]How to keep a strong reference inside of a block without having a retain cycle
[英]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.