2014-04-03 41 views
4

有一個關於弱自我,積木和保留週期的問題。WeakSelf in blocks

通過這本書我明白我們需要使用weakself塊.. 的問題是,什麼時候?

例如,簡單的動畫代碼,不會包含weakself ..

self.myView.alpha = 1.0; 
[UIView animateWithDuration:0.2 animations:^{ 
self.myView.alpha = 1.0; 
}]; 

是這段代碼好嗎?或者我應該在塊之前創建一個弱點並在裏面使用它?

在我所有的代碼和所有其他項目中,從來沒有看到過使用弱自我的單一行。 現在我試圖用weakself每塊.. 它只是我不知道這是必要

期待着您的意見 感謝

+0

「只是我不確定它是否有必要」 - 在某些情況下,爲了防止內存泄漏,它絕對是必需的。你經常分析你的應用程序?你是否發現內存使用量不斷增加? (不要只依賴泄漏工具,這不是很棒)。如果確實如此,則可能有泄漏,如果您使用的是ARC,則這些泄漏幾乎總是保留週期。 –

+0

這段代碼沒問題。 –

回答

4

正如其他人所指出的那樣,你絕對應該使用情況weakSelf模式,你本來有很強的參考週期(又名保留週期)。但更一般地說,只要不希望塊保留對象本身(即使在沒有保留週期的情況下),也應該使用weakSelf

一個很好的例子是由某個視圖控制器啓動的網絡操作。假設用戶啓動一些上傳。問題是您是否希望異步上傳過程保留視圖控制器,即使它可能具有對該視圖控制器的引用來更新某些進度欄等。如果視圖控制器被解散,您可能不希望它保留視圖控制器,即使您可能想要繼續上傳。

這只是一個隨機的例子,但底線,你可能想要使用weakSelf模式,只要你想要後臺進程繼續,但你不希望它保留其他對象。只要看看您的功能需求並考慮強大的參考週期風險,並決定是否需要採用weakSelf模式。

animateWithDuration的情況下,動畫在視圖關閉時停止,強參考立即解析,因此沒有強參考週期。

7

你應該使用弱異體時,有可能的保留週期。

想象一下foo的一個實例對bar有很強的參考價值。現在你給酒吧一塊提及foo的自我。現在有人發佈foo,但酒吧阻止了周圍的環境。現在foo對酒吧有很強的參考性,而酒吧在這個街區擁有強烈的foo參考。 Foo不會被釋放,因此也會被禁止,因爲酒吧持有它。但唯一留住酒吧的是現在未使用的foo。你有自己的保留週期,並且這兩個對象現在浮在內存中無法到達。

UIView的動畫沒有問題,因爲在animate:方法返回之前調用該塊,並且UIView不會保留該塊。

只要ARC發現保留週期的可能性,ARC通常會發出警告。但情況並非總是如此。一個很好的經驗法則是,當你不知道塊會在哪裏出現時,使用弱自我。

希望這有點幫助。