2012-09-11 119 views
5

我在引導自己在塊內引用自己的頭並且沒有創建保留週期時遇到了一些麻煩。塊,自我,保留週期

你能不能讓我知道如果我的理解是正確的:

如果我曾經顯示模塊中的自我,它會創建一個保留週期,而是我應該創建塊外弱引用自然後在塊內使用那個弱引用?

謝謝!

回答

11

是的,這是正確的,但有一些例外:

甲保留週期如果self結束間接保持塊,例如只發生在屬性設置的selfmyproperty財產myblock

self.myproperty.myblock = ^{ [self dosomething]; }; // ERROR: Retain Cycle 

然而,保留週期不(通常)使用塊時類似調度代碼,像這樣發生的:

dispatch_async(dispatch_get_main_queue(), ^{ [self dosomething]; }); // Safe, dispatch_async will not be retained by you 

當然,除非您在具有保留週期標準的塊內調用dispatch_async函數。

這實在令人困惑,而且這是我希望得到修復的東西。現在,我自己的看法:


這是情況並非總是如此,在弧前的代碼,這不是一個問題,但由於模塊現在自動保留他們捕捉到任何物體,這是一個問題。

我希望這會得到解決,因爲這將是一個相當簡單的解決方案,通過self的類型是__weak instancetype const而不是instancetype const。它還可以解決在ARC中創建類集羣時的一些問題,這確實不是最大的問題,但它仍然存在。

就保留週期的優勢而言,並不多。

+1

保留週期並非嚴格意義上的錯誤 - Block的擁有者通常有可能在自己銷燬之前處理該Block,打破週期並避免任何問題。 –

+0

僅僅爲自己創建一個弱引用並且總是在塊內部使用該弱引用是安全的,只是爲了確保沒有保留週期? (假設我認爲塊執行的可能性,selfWeak可以是一個零指針?) –

+0

@WiseShepherd當然,這就是你如何修復保留週期,在大多數情況下。 –