关于打破块内保留周期的大量问题,我的问题如下:
块如何实际处理其中的__weak
个引用?
我知道这件事(取自here):
Blocks将保留他们在封闭中使用的任何NSObject 复制时的范围。
那么如何处理__weak
资格所有权?理论上,因为__weak
它不会保留它?会不会引用它?
答案 0 :(得分:1)
正确,弱引用不会被保留。它的工作方式正如您所期望的那样。一旦取消分配对象,它们将设置为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发行说明中的Use Lifetime Qualifiers to Avoid Strong Reference Cycles中的“非平凡循环”讨论中进行了说明。
答案 1 :(得分:0)
弱引用被弱捕获,因此指向它们的对象在块的生命周期内不一定保持活动状态。