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