2013-05-25 50 views
2

我遇到了UIView動畫塊的奇怪事情。iOS沒有清理UIView動畫的完成塊嗎?

我運行我的動畫代碼後從未釋放的視圖。在調用動畫代碼之前,我將view屬性設置爲nil。然後在完成塊內,我將它從超視圖中刪除,所以淡出後它不見了。

但是,淡出和刪除視圖的-dealloc從不會被調用。然後,我想可能完成塊保留了視圖,並使用__weak工作的弱參考。突然,動畫完成後視圖正常釋放。

但是在動畫塊本身中,我只是引用視圖並將其alpha設置爲0.沒有__weak引用,仍然視圖正常釋放。

結論: iOS在動畫完成後清理動畫塊。但它不會清理完成塊。意思是:對於完成塊中的所有內容,您必須使用__weak引用,因爲它會一直存在。

是否有一種神奇的方式來觸發完成塊處理或清理,因此它釋放所有強引用?當然我使用ARC btw。

+1

我希望你已經知道你的結論是錯誤的。您可能會有一個保留週期,因爲Caleb建議*如果* self'對引起內存泄漏的完成塊持有強烈的引用。但是,如果你使用標準的'+ [UIView animate ...'方法,就不會發生這種情況。只有在發佈代碼時才能夠進一步提供幫助。 – Mar0ux

回答

1

這聽起來像是您在塊中使用了強引用而無意中創建了保留循環。該觀點強烈地提到該塊,該塊對該視圖提供了強烈的參考,並且相互強烈的引用阻止了任何一個被解除分配。將塊的引用轉換爲弱打破了循環,允許取消分配視圖(最終塊)。

你會發現一個很好的討論在這個SO問題中創建保留循環的可能性:ARC, ivars in Blocks and Reference Cycles via Captured Self

+0

不,我根本沒有引用該塊。只是通過它作爲動畫方法的參數。 – openfrog