繁体   English   中英

块如何处理__weak引用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM