2012-09-11 42 views
1

鑑於我們與ARC編寫代碼,我應該在viewDidUnloadnil特性,即是從實例:viewDidLoad中和ARC和XIBs

  1. XIB(這裏的nilling有時會從IDE生成)

  2. 從初始化器並沒有IBOutlet中

  3. 是弱

回答

1

viewDidUnload的目的是讓您的應用程序有機會刪除對用戶界面對象的引用,這些用戶界面對象可能不再存在,因爲視圖在收到內存警告時被刪除。因此:

  1. 你應該設置任何用戶界面控制以nil(因爲該視圖被卸載)。對於weak屬性不需要(對於此主題,它們通常應該是weak/Apple guidance),但是如果Xcode爲您插入它,這不是問題。有關如何在viewDidUnload中執行操作的指導,請參閱Resource Programming Guide: The Nib Files的「存儲器警告」部分。

  2. 併爲您在viewDidLoad建立非用戶界面對象,我會很警惕,只是一味地設置那些nilviewDidUnload,特別是如果你不使用ARC(例如,如果你不小心nil實例變量,你可能會導致泄漏)。您可能想要平衡將要恢復的內存量與重新檢索該數據的「成本」(例如,如果它來自某個遠程服務器)。無論如何,我建議你在didReceiveMemoryWarning中處理非UI對象的內存釋放。

在我心中,我認爲viewDidUnload爲契機,以確保我不是在維護可能不再存在於用戶界面對象的引用,我用didReceiveMemoryWarning清空緩存或其他非UI相關的項目我可以安全地清除以恢復一些內存。如果您擔心iOS 6,請注意,viewDidUnload的處理方式可能會發生變化,而NDA不允許我們公開討論,但我可能會建議您可能需要參考iOS 6 Beta 4 Release Notes並查找參考viewDidUnload

+0

將'weak'變量設置爲'nil'是可取的? 「weak」引用背後的想法是,它們自動爲您自動「刪除」。您應該**從不**需要手動刪除「弱」參考。而且,由於'viewDidLoad'總是在'viewDidUnload'之後被調用,如果再次需要視圖,那麼創建的非UI屬性是釋放更多內存的好方法。最後,他正在談論物業。如果你使用'self.property = nil;'你永遠不會泄漏(除非你正在做一些非常錯誤的事情)。 – Mazyod

+0

@Mazyod Re弱到零,你說得很對。鑑於當您通過Interface Builder創建IBOutlet時,Xcode會自動添加用於將'IBOutlet'屬性設置爲'nil'的代碼行,我認爲這將被認爲是一種很好的做法,重要的是,對於弱IBOutlet屬性是沒有必要的。它沒有任何壞處(例如,在通過和刪除Xcode添加的代碼行時沒有意義),但是沒有必要。我相應地修改了我的答案。 – Rob

+0

@Mazyod關於你對如何將屬性設置爲'nil'的評論,你不會泄漏:我同意,但我的評論是關於某些人偶然地將_property的實例變量_設置爲'nil'的情況。 (而且新程序員不可避免地將這些屬性的引用與這些屬性的實例變量混淆在一起。)更重要的一點是,僅僅因爲它是一個屬性,你不應該輕易地將它們'刪除'。這只是UI屬性。非UI屬性(a)應逐案處理;和(b)無論如何都不應該在'viewDidUnload'中完成。 – Rob

1

您的一般規則:

  1. nil所有strong IBOutlets只。單獨留下weak
  2. nil所有屬性實例化viewDidLoadinitinitWithCoder:initWithNibName:bundle:

您還應該nil「即時」重新創建或nil檢查,以釋放更多內存的屬性。