从关于打破块内保留循环的大量问题中,我的问题如下:
块实际上如何处理__weak
它内部的引用?
我知道这一点(取自这里):
复制时,块将保留它们在其封闭范围内使用的任何 NSObject。
那么它是如何处理__weak
资格所有权的呢?理论上既然是__weak
它就不会保留它?只会保留对它的引用吗?
从关于打破块内保留循环的大量问题中,我的问题如下:
块实际上如何处理__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 发行说明中使用生命周期限定符来避免强引用循环中的“非平凡循环”讨论中进行了说明。
弱引用被弱捕获,因此指向它们的对象不一定在块的生命周期内保持活动状态。