[英]How blocks handles __weak references
关于打破块内保留循环的大量问题,我的问题是:
该块实际上如何处理其中的__weak
引用?
我知道这一点(从此处获取 ):
块在复制时将保留其在其作用域中使用的所有NSObject。
那么如何处理__weak
资格所有权? 从理论上讲,由于它是__weak
它不会保留吗? 会继续引用它吗?
正确,弱引用将不会保留。 它的工作原理完全符合您的期望。 一旦对象被释放,它们将被设置为nil
。
尽管这通常很好(您不希望仅通过块的存在来保留它),但有时可能会出现问题。 通常,您要确保一旦执行了该块,就在该块执行期间(但不是在执行该块之前)保留该块。 为此,可以使用weakSelf
/ strongSelf
模式:
__weak MyClass *weakSelf = self;
self.block = ^{
MyClass *strongSelf = weakSelf;
if (strongSelf) {
// ok do you can now do a bunch of stuff, using strongSelf
// confident that you won't lose it in the middle of the block,
// but also not causing a strong reference cycle (a.k.a. retain
// cycle).
}
};
这样,您将没有保留周期,但是您不必担心它会得到异常或其他问题,如果仅使用weakSelf
会导致异常。
在使用生命周期限定符以避免在过渡到 David所引用的ARC发行说明中使用强引用周期时 ,在“非平凡周期”讨论中对此模式进行了说明。
弱引用被弱捕获,因此指向它们的对象不一定在该块的生存期内保持活动状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.