2013-05-09 29 views
2

從大約打破保留內部塊週期問題,一個龐大的數字,我的問題是:塊如何處理__weak引用

如何塊實際上處理它裏面__weak引用?

我意識到這一點(從here拍攝):

塊將保留任何NSObject的他們離開封閉 範圍,他們被複制時使用。

那麼如何照顧__weak資格所有權呢?理論上,因爲它是__weak它不會保留它?只會保留一個參考嗎?

+0

閱讀ARC編程指南中的「使用壽命限定符以避免強參考週期」。 – 2013-05-09 20:22:18

+0

重點不在於避免參考週期@DavidH,它是如何在保留被限定爲'__weak'的對象時進行處理。理論上不應保留,但只是想確定它。 – Peres 2013-05-09 21:03:12

回答

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

此模式在Use Lifetime Qualifiers to Avoid Strong Reference Cycles轉換爲David引用的ARC發行說明的「非重複循環」討論中進行了說明。

+0

好的羅布,這就是我的想法,它有什麼意義:「弱引用不會被保留」 – Peres 2013-05-09 20:40:43

0

弱引用被弱地捕獲,因此指向它們的對象不一定在塊的整個生命週期內保持活動狀態。

+0

但這裏的重點與舞蹈'__weak MyClass * self'有關。如果你不去,你將有一個保留週期。 – Peres 2013-05-09 20:22:35

+0

當然。打破循環就是弱引用。它們在塊方面的表現並不相同。 – 2013-05-09 20:33:11