块如何处理__weak引用

时间:2013-05-09 20:14:11

标签: ios objective-c objective-c-blocks

关于打破块内保留周期的大量问题,我的问题如下:

块如何实际处理其中的__weak个引用?

我知道这件事(取自here):

  

Blocks将保留他们在封闭中使用的任何NSObject   复制时的范围。

那么如何处理__weak资格所有权?理论上,因为__weak它不会保留它?会不会引用它?

2 个答案:

答案 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)

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