2011-01-05 37 views
1

我正在完成一個iPad應用程序,對我而言,這意味着填寫我所有課程中的所有dealloc方法。iOS SDK - dealloc實現 - 首先發布子視圖?

我在我的筆尖有很多視圖,其中大部分都包含子視圖(即UIView s,UILabel s等)。在釋放父母之前我應該​​釋放孩子的意見嗎?如果父視圖被釋放,其子視圖是否也會被釋放?

樣品:

-(void)dealloc 
{ 
    [super dealloc]; 
    [childView release]; // Do I need this if I use the next line? 
    [parentView release]; // Will this perform the line above? 
} 

兩個childViewparentView是我的視圖控制器的性能。兩者都被保留。

回答

9

任何已保留(無論是明確的還是通過保留的屬性)需要釋放內存管理以達到平衡。

此外,您應該在dealloc實施的末尾調用[super dealloc],而不是開始(例如,因爲您可能依賴當時仍然可用的超類資源)。

+0

'childView'和'parentView'都是我的類的屬性,並且都保留了。在這個例子中,'childView'應該在'parentView'之前發佈還是不重要? – 2011-01-05 18:51:39

+0

@Evan Mulawski你釋放你的屬性的順序應該不重要,除非你有自定義訪問器做瘋狂的事情。 – 2011-01-05 18:55:21

+0

它應該沒關係,因爲父視圖應該有一個對子視圖的引用。因此,孩子不會被釋放,直到父母的dealloc被調用,並最終釋放給孩子。 – Winder 2011-01-05 18:56:34

1

既然您指定您有NIB的子視圖,這聽起來像您還可能需要密切注意viewDidUnload方法。

可以通過將插口設置爲零來隱式釋放從筆尖自動分配的任何視圖。例如:

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    self.subviewOutletOne = nil; 
    self.subviewOutletTwo = nil; 
} 

那麼對於您明確保留任何對象,釋放他們在dealloc方法就像你打算做:

- (void)dealloc { 
    [myDataArray release]; 
    [coolAnimatedImage release]; 
    [myCustomSubview release]; 
    [super dealloc]; 
} 

此外,一定要檢查出LEAKS儀器。這是使用內置泄漏分析工具的隨機教程。可能有其他/更好的。第一次起牀和跑步可能會很痛苦,但完全值得。

+0

需要在**''viewDidUnload'和'dealloc'中釋放保留視圖(顯式或隱式)。前者不保證在視圖控制器發佈前被調用。 – 2011-01-05 19:02:12

+0

你說當一個視圖被nib「解凍」時,我應該在'dealloc'中釋放它?我從來沒有聽說過。 – Winder 2011-01-05 19:17:41

+0

請參閱http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW36上的「特殊注意事項」部分以及http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html#//apple_ref/doc/uid/TP40004998-SW1 – 2011-01-05 19:55:29

2

順便說一句,保存你的dealloc寫作,直到你完成應用程序的工作是一個倒退的路。我知道這似乎是家務清理工作,但事實是,直到你正確地管理內存,你將會對你的應用程序真正執行的方式有一個非常傾斜的看法。

理想情況下,您應該在編寫@synthesize語句時編寫dealloc調用。換句話說,您將一個屬性添加到您的類中,將其設置爲保留屬性,然後編寫它的@synthesize和-release代碼。這樣你就知道你的內存管理基本上是乾淨的(我的意思是,無論如何都是在類的屬性級別),你可以自信地編寫代碼。

+0

上的最後幾段。我通常在創建助手類時進行此操作,並且屬性數不超過兩個或三個。當我不斷改變我的用戶界面和重命名控件時,這會變得乏味。 – 2011-01-05 19:14:13