2009-10-30 37 views
3

我有一個uiviewcontroller實例,當我釋放它時,它的dealloc方法被調用。由於uview控制器[super dealloc]造成的內存崩潰

我已經發布了一些在dealloc方法中的對象uiviewcontroller

如果我評論[super dealloc]該應用程序工作正常,但如果不是它崩潰。

我認爲我在這個方法中使用的版本沒有問題,但是如果我做的是[super dealloc]它會崩潰。

任何人都可以幫助我嗎?

+0

你能從調試器控制檯發佈錯誤消息嗎? – Morion 2009-10-30 12:13:30

+0

你可以發佈你的dealloc方法包含[super dealloc]嗎? – richleland 2009-10-30 12:24:35

回答

4

很難從您的文章中分辨出沒有更多信息,但您的dealloc方法是這樣嗎?

- (void)dealloc { 

    [super dealloc]; 

    self.someProperty = nil; 
} 

因爲如果是這樣,那麼您在釋放實例上調用setter方法。你應該總是調用[超級的dealloc]最後:

- (void)dealloc { 

    self.someProperty = nil; 

    [super dealloc]; 

} 

不知道有沒有什麼幫助。嘗試發佈你的dealloc方法,如果不是的話。很難在黑暗中排除故障。

+4

你不應該在dealloc中訪問這樣的屬性 - 它被認爲是不好的做法,因爲你正在重新進入正在被釋放的對象。你應該這樣做:[someProperty發佈],someProperty =零; – 2011-05-16 08:32:40

1

無法在沒有更多信息的情況下幫助您。你描述的代碼非常好。問題出在你的應用的其他部分。

您可能在釋放它之後訪問視圖控制器,所以問題不在於[super dealloc],而是訪問視圖控制器的應用程序中的任何其他位置。

+0

這也是我的第一個想法。當不調用超級dealloc時,你的對象不會被釋放,其他地方的壞代碼仍然可以工作。當您取消超級通話的註釋時,錯誤會再次出現。 – 2010-12-02 05:26:47

0

也許你是在錯誤的地方釋放控制器。這可能是爲什麼你的ViewController.m中的[超級dealloc]崩潰的原因

你不應該調用[viewController release],直到你想要控制器死掉。例如,如果你的應用程序只有一個viewcontroller,你就不能在應用程序結束之前釋放它。這是因爲該控制器需要始終保持活躍狀態​​來控制視圖。如果您在ApplicationDelegate這樣的事情有,它會崩潰:

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
UIViewController *controller = [[UIViewController alloc] init]; 
[window addSubview:controller.view]; 
[controller release]; //this will crash 
} 

相反的,你應該把你的ViewController在頭文件(.h)中,並在dealloc方法釋放:

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

我希望這有助於。