2

从关于打破块内保留循环的大量问题中,我的问题如下:

块实际上如何处理__weak它内部的引用?

我知道这一点(取自这里):

复制时,块将保留它们在其封闭范围内使用的任何 NSObject。

那么它是如何处理__weak资格所有权的呢?理论上既然是__weak它就不会保留它?只会保留对它的引用吗?

4

2 回答 2

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 发行说明中使用生命周期限定符来避免强引用循环中的“非平凡循环”讨论中进行了说明。

于 2013-05-09T20:27:14.050 回答
0

弱引用被弱捕获,因此指向它们的对象不一定在块的生命周期内保持活动状态。

于 2013-05-09T20:19:50.747 回答