簡體   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