2017-10-14 60 views
1

我想知道,如果它是實現每個視圖控制器上的deinit檢查它是否是當它消失,避免了內存泄漏正確刪除一個好的做法呢?當他們不再需要,以騰出資源Deinit是在viewControllers上實現它的好習慣嗎?

+0

絕對不是僅僅用於「檢查某些東西」。而且,對於控制器來說,通常使用自己的生命週期方法是有意義的。 – Sulthan

+0

這是測試/開發/調試的好習慣,但不適用於發佈。一旦你有良好的「記憶衛生」,那麼內存泄漏應該變得罕見/不存在。 –

回答

2

默認情況下,你必須實現deinit方法在你的類:

斯威夫特自動將釋放你的情況下,當他們不再需要 ,以釋放資源。迅速通過自動引用計數(ARC)處理 實例的存儲器管理,如在 自動引用計數說明。通常你不需要當你實例釋放執行 手動清除。但是,當您使用自己的資源時,您可能需要自行執行一些額外的清理。例如,如果您創建一個自定義類 打開一個文件,寫一些數據,你可能需要關閉 文件中的類的實例被釋放之前。

斯威夫特去初始化文件 - How Deinitialization Works節。

通常,在使用View Controllers時,似乎不需要做這樣的實現。然而,如在@rmaddy的評論中提及,但它仍然是用於跟蹤內存泄漏或基準週期與視圖控制器的方法。

如果您的目的是檢查控制器是否已從層次結構(視圖控制器生命週期)中刪除,則可以實施viewWillDisappear(_:)viewDidDisappear(_:)方法;請注意,調用這些方法對不保證了deinit將被調用,即它並不意味着永遠消失視圖控制器導致釋放它(相關:Deinit never calledexplanation for deinit not called)。

另外:

這些問與答&如應該是有用的:

+1

tl; dr - 是的,使用'deinit'是驗證您沒有視圖控制器的內存泄漏或參考週期的一種方法。 – rmaddy

+0

@rmaddy謝謝你的提示,回覆更新。 –

1

斯威夫特會自動回收您的實例。所以要添加deinit你所有的viewControllers似乎沒有必要。無論何時您需要在釋放對象之前執行一些操作或清理,您都應該調用deinit

1

那麼在測試階段,它也許好主意,因爲你可以檢查,如果一切都很好(比如,如果你有很多完成處理的),但總體來說是不必要的。

相關問題