從大約打破保留內部塊週期問題,一個龐大的數字,我的問題是:塊如何處理__weak引用
如何塊實際上處理它裏面__weak
引用?
我意識到這一點(從here拍攝):
塊將保留任何NSObject的他們離開封閉 範圍,他們被複制時使用。
那麼如何照顧__weak
資格所有權呢?理論上,因爲它是__weak
它不會保留它?只會保留一個參考嗎?
從大約打破保留內部塊週期問題,一個龐大的數字,我的問題是:塊如何處理__weak引用
如何塊實際上處理它裏面__weak
引用?
我意識到這一點(從here拍攝):
塊將保留任何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
。
此模式在Use Lifetime Qualifiers to Avoid Strong Reference Cycles的轉換爲David引用的ARC發行說明的「非重複循環」討論中進行了說明。
好的羅布,這就是我的想法,它有什麼意義:「弱引用不會被保留」 – Peres 2013-05-09 20:40:43
弱引用被弱地捕獲,因此指向它們的對象不一定在塊的整個生命週期內保持活動狀態。
但這裏的重點與舞蹈'__weak MyClass * self'有關。如果你不去,你將有一個保留週期。 – Peres 2013-05-09 20:22:35
當然。打破循環就是弱引用。它們在塊方面的表現並不相同。 – 2013-05-09 20:33:11
閱讀ARC編程指南中的「使用壽命限定符以避免強參考週期」。 – 2013-05-09 20:22:18
重點不在於避免參考週期@DavidH,它是如何在保留被限定爲'__weak'的對象時進行處理。理論上不應保留,但只是想確定它。 – Peres 2013-05-09 21:03:12