2012-04-16 33 views
4

使用xcode 4.2 for iPhone應用程序,無ARC ---Interface Builder將控制點設置爲零 - 爲什麼?

當我使用界面生成器創建插座時,xcode向我的viewController添加了兩行代碼。一個在viewDidUnload: - [self setMyOutlet:nil],第二個在dealloc - [myOutlet release]

我明白後者(發佈)。但爲什麼在viewDidUnload中將插座設置爲零。在dealloc之前不會調用viewDidUnload,並且不會將deutoc中的outlet設置爲否定否定釋放操作?設置爲零是有道理的,我認爲構建一個使用垃圾回收的Mac應用程序 - 但它對iPhone應用程序沒有意義。

爲什麼界面生成器會這樣做?我應該刪除設置網點的線路爲零嗎?

+0

我不知道你是否正確,但如何在這個函數中設置一個斷點來解決它? – Seega 2012-04-16 18:58:01

+0

[爲什麼在viewDidUnload中爲IBOutlet分配nil?](http://stackoverflow.com/questions/7318599/why-assign-nil-to-iboutlets-in-viewdidunload) – 2012-04-16 19:07:35

回答

3

viewDidUnload可能被調用,可能不會被調用。這取決於當前的內存使用情況。 dealloc是一個您應該清潔的地方全部您的屬性(如數組,自定義對象)。在viewDidUnload中,您可以清理視圖,也可以創建支持視圖的對象。 viewDidUnload表示您的視圖被卸載(但不是整個視圖控制器),並且可能會在將來再次創建並加載(當然是在viewDidLoad中)。

+0

謝謝。這現在是有道理的。我所缺少的是由@synthesize創建的setter將在將指針設置爲nil之前釋放該對象。我想知道爲什麼我沒有在分析器中看到內存鏈接。謝謝你的回答! – lp1756 2012-04-16 19:33:08

0

viewDidUnload是不是一個dealloc的前稱爲每次,看到蘋果的文檔說什麼..

當內存不足情況發生並且不需要當前視圖控制器的視圖,則系統可以選擇從 存儲器移除這些視圖。這個方法在視圖控制器的視圖 被釋放後調用,並且是您執行任何最終清理的機會。如果您的視圖控制器存儲對視圖或其子視圖的單獨引用,則應使用此方法來釋放這些引用。您還可以使用此方法刪除對您創建的任何對象的引用,以支持該視圖,但現在不再需要該視圖,因爲該視圖不再需要。您不應該使用此方法釋放用戶數據或任何其他無法輕易重新創建的信息。

所以它背後的想法是太釋放任何可以輕鬆創建的不需要的對象。 現在來到它將屬性設置爲零的那一部分。它這樣做是因爲這樣你釋放所有內存並將對象設置爲零(從而使你的內存使用量減少),並且在此之後如果調用dealloc應用程序不會崩潰,因爲在objective-c中,您可以將發佈消息發送給零對象。

我建議您閱讀蘋果ViewController Programming Guide,它會清除很多問題....希望這可以清除一些空氣..:D

相關問題