2012-09-28 39 views
3

如果我對視圖層次結構中的視圖有強烈的引用,是否必須將它設置爲viewDidUnload中的nil,還是由ARC處理?ARC和viewDidUnload

回答

6

前兩個答案中有太多的錯誤信息,我將準確地澄清情況。請注意,這些是相對於部署目標,而不是你是否使用iOS6的SDK構建):

  • 你不用擔心self.view - 在的UIViewController管理着

  • 頂級對象 - 即那些沒有包含在另一個對象 - 一定要堅強

  • 其他對象應使用弱(系統零的他們被釋放防止崩潰試圖使用一個釋放的對象時,伊娃)

  • 用於在iOS6之前的設備上進行部署,使用viewDidUnload釋放頂層對象和其他任何您想要的內容。注意:dealloc不會在此之後調用 - 下一條消息很可能是viewDidLoad,當內存問題導致消息消失且視圖重新出現時)

  • 對於iOS6和更高版本,請勿使用viewDidUnload請參閱下面的編輯),如果您想釋放與視圖或其他UI對象無關的內存,請使用didReceiveMemoryWarning。

  • dealloc在所有版本中都被調用。使用ARC,您不會稱爲超級,而且您也不像過去那樣釋放內存。

編輯:從iOS6的SDK UIViewController類描述:

viewDidUnload 當控制器的視圖是從 存儲器釋放時調用。 (不推薦使用iOS中6.0視圖是 低內存情況下不再清除,因此該方法不會被調用。)

什麼蘋果確實做的就是刪除備份存儲 - 緩存的像素。他們發現這消除了大部分消耗的內存,並且viewDidUnload實施效果不佳(他們在WWDC 2012上告訴我們這一點)。

+0

投票贊成有用的情況分析。順便說一句,你的意思是不要在iOS6和更高版本中使用'viewDidUnload'? – Carina

+0

小費5中是否有拼寫錯誤? – Carina

+0

@Carina,你能更具體嗎?我會嘗試讓子彈項目5現在更清晰。 –

1

如果您有一個對對象具有strong引用的ivar,那麼只要該ivar指向該對象,該對象就會停留。

所以是的,你需要將指針設置爲nil,否則你的強壯的引用將保持視圖的活躍。如果視圖是從一個筆尖加載的,並且它不是rootView,那麼建議使用weak,這樣您就不必擔心這個問題。

+0

爲什麼我需要將它設置爲零?在viewDidUnload之後,dealloc被調用並且引用被設置爲nll – 0xSina

+0

dealloc並不總是在viewDidUnload之後被調用。這是一個可疑的方法,這是蘋果在iOS 6中棄用它的原因的一部分。基本上,系統試圖釋放內存,所以你應該手動清零你可以在該方法中不用一會兒就能生存的任何東西(非常多與didReceiveMemoryWarning一樣) – borrrden

+0

@borrrden dealloc在iOS6中棄用? -_-你能聯繫我嗎?我們什麼時候發佈malloc-ed的東西呢? – 0xSina