2010-03-03 26 views
1

我正在處理viewDidUnload和dealloc方法,並在調用[super dealloc]時創建了一個問題;在父視圖控制器中。iPhone:在parentViewController上調用dealloc導致異常

我有很多視圖控制器的自定義代碼,我把它們放在父視圖控制器之外。所以,限定我的視圖控制器,當我設置到超類的引用:

@interface LoginViewController : AbstractViewController 

然後,在dealloc方法我稱之爲AbstractViewController dealloc方法:

//(Login View Controller code) 
- (void)dealloc { 
    [user release]; 
    [passwd release]; 
    [super dealloc]; 
} 

[超級的dealloc]中執行以下代碼:

//(Abstract View Controller code) 
- (void)dealloc { 
    [dbUtils release]; 
    [loadingView release]; 
    [super dealloc]; 
} 

如果我模擬內存在iPhone模擬器警告,下面的異常被拋出:

2010-03-03 11:27:45.805 MyApp[71563:40b] Received simulated memory warning. 
2010-03-03 11:27:45.808 MyApp[71563:40b] *** -[LoginViewController isViewLoaded]:  message sent to deallocated instance 0x13b51b0 
kill 
quit 

但是,如果我評論AbstractViewController中的[super dealloc]行,則不會引發異常,並且我的應用程序仍在運行。

再次感謝您的幫助!

+0

什麼是加載視圖? – willcodejavaforfood 2010-03-03 10:42:47

+0

是在AbstractViewController initWithNib中初始化的另一個viewController ...與self.loadingView = [[UIViewController alloc] initWithNibName:@「LoadingViewController」bundle:nil]; – arielcamus 2010-03-03 10:49:09

回答

2

它看起來像你正在釋放你的視圖控制器,但然後試圖再次使用它。當由於內存警告釋放視圖控制器時,請記住將指針設置爲零,以免意外再次使用它。即像

[myLoginViewController release]; //!< Triggers the dealloc call 
myLoginController = nil; //!< Makes sure we never use it again 

,或者如果myLoginViewController是一個屬性,你可以在一個更合適的方法做到這一點:

self.myLoginViewController = nil; 

希望幫助,

山姆

1

通知-didReceiveMemoryWarning做不會觸發-dealloc,它會觸發-viewDidUnload。所以我想這是你的-viewDidUnload實現,它執行了一些錯誤,導致控制器的最終保留被釋放,所以調用了-dealloc。我剛纔在代碼中遇到了這個問題,這是由-viewDidUnload中釋放的保留回收引起的。

0

這發生在我身上,花了一段時間才弄清楚。其中一位代表試圖發送信息,因爲代表是自己的,這是一個有力的參考。當我使它變弱時似乎已經修復了它。

相關問題