1

試圖追查某些設備上崩潰的原因。我注意到我的視圖控制器正在接收didReceiveMemoryWarning,但不是viewDidUnload。而根據蘋果:iOS - 未調用viewDidUnload,但調用了didReceiveMemoryWarning

你不會用didReceiveMemoryWarning釋放的引用,查看對象,你可以用它來釋放你沒有在你的viewDidUnload方法已經釋放任何視圖相關的數據結構。 (視圖對象本身應始終在viewDidUnload方法被釋放。)

所以,

答:爲什麼viewDidUnload不叫?如果它從未被調用過,我不能在這裏刪除我的視圖對象。 B:如果我不應該在didReceiveMemoryWarning中刪除我的視圖對象,那麼我會在哪裏做到這一點? C:使用ARC,我是否仍然需要刪除視圖對象,將數組設置爲零等?

+0

我覺得這不太可能你的崩潰是因沒有除去意見和這樣造成的。你應該檢查使用儀器內存不足導致崩潰。 – MaxGabriel

+0

@MaxGabriel我內存不足。但我的一個視圖控制器有很多圖像。所以,當我收到警告時,我可以釋放內存並將其移除。 – soleil

回答

0

didReceiveMemoryWarning特別不針對一個視圖的卸載,而是用於視圖控制器,其可以很容易地被重新創建(即UIIamges等)釋放對象。除非可以根據需要輕鬆重新創建,否則不應在視圖中釋放對象。

1

viewDidUnload已在iOS6中棄用。如果您認爲有必要,您可以「移除」didReceiveMemoryWarning中的視圖,但這是由您決定的。

此主題可能也有幫助。

viewDidUnload no longer called in ios6

+0

聖潔的廢話,我不知道這一點。這不會讓任何清理viewDidUnload中的視圖的應用程序在獲取內存警告時非常容易崩潰嗎? – soleil

+0

如果視圖沒有被卸載,視圖控制器如何知道重新加載視圖?我可以刪除didReceiveMemoryWarning中的圖像視圖,但現在當我回到視圖控制器時,它們已經消失 – soleil

+0

我不是百分之百,但我的理解是,如果您設置了'self.view = nil',則在下次訪問view,'viewDidLoad'將被調用。順便說一句,如果你將子視圖建立爲'IBOutlet',最好的做法似乎是將它們聲明爲'weak'屬性,這樣當你設置'self.view = nil'時,所有的子視圖也會被釋放。 – barley

2

如前所述viewDidUnload:其他被棄用的iOS 6,但隨着更多的信息,你應該知道,這是很少有必要卸載UIView,因爲iOS 6的是做它的神奇的thingie在後臺-IT正在破壞該視圖的背景CALayer的位圖層(這是迄今爲止UIView的最大「部分」)。如果再次需要視圖,iOS會調用drawRect:,您可以在其中構建視圖,並且一切都會正常。

欲瞭解更多信息,請閱讀喬康威的這篇大文章:ViewController lifecycle in iOS 6

相關問題