2011-09-16 152 views
0

在我的應用程序im調用presentModelViewController來呈現一個新的控制器。每次這個動作都會觸發內存分配。但不知何故,它不能正確釋放,因爲在某些時候我的應用程序使用了太多的內存,並且崩潰了。釋放viewDidUnload中的對象?

可能這是因爲我沒有正確地釋放屬性對象(或根本沒有)下面提到的是正確的方式嗎? dealloc可能是,但viewDidUnload呢?

- (void)viewDidUnload { 
    [_sushiTypes release]; 
    _sushiTypes = nil; 
} 

- (void)dealloc { 
    [_sushiTypes release]; 
    _sushiTypes = nil; 
    [super dealloc]; 
} 

回答

3

不要忘記在viewDidUnload中調用super。您還應該通過其setter來訪問您的實例變量,以將其設置爲在viewDidUnload中爲零。在dealloc中,直接釋放實例變量。

- (void)viewDidUnload { 
[super viewDidUnload]; 
NSLog(@"viewDidUnload being called"); 
self.sushiTypes = nil; 
} 

- (void)dealloc { 
[_sushiTypes release]; 
NSLog(@"dealloc being called"); 
[super dealloc]; 
} 

雖然我不認爲這是你的內存問題的根源。你的模態視圖控制器是否有其他實例變量或IBOutlets?

爲了幫助進一步調試,請嘗試使用儀器。在Xcode中,轉到產品>配置文件,然後在儀器打開時選擇分配模板。然後多次打開和關閉模態視圖控制器,並檢查泄漏和分配。如果每次您提交/解僱時分配都在增加,那麼請嘗試在每次出席/解僱前後單擊「標記堆」按鈕。然後,您可以檢查正在分配的對象,而不是每個週期都釋放。

1

我想我找到了問題。您應該永遠不要在dealloc函數中分配nil值。發佈時的通常做法是將viewDidUnload與setter分配nil值,然後在dealloc方法中正確釋放該屬性。像這樣:

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

- (void)dealloc { 
    [_sushiTypes release]; 
    [super dealloc]; 
} 

記得在viewDidUnload中調用super,就像Matty說的那樣。你可以參考這個SO問題來獲得關於這個過程的更多信息。 First set to nil and then release.