我正在处理viewDidUnload和dealloc方法,我在调用[super dealloc]时遇到了问题;在父视图控制器中。
我有很多带有自定义代码的视图控制器,我在外部视图控制器上放置了这些代码。因此,在定义我的视图控制器时,我设置了对超类的引用:
@interface LoginViewController : AbstractViewController
然后,在dealloc方法中,我调用AbstractViewController dealloc方法:
//(Login View Controller code)
- (void)dealloc {
[user release];
[passwd release];
[super dealloc];
}
[super 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 :(得分:2)
看起来您正在释放视图控制器,但之后又尝试再次使用它。当您因内存警告而释放视图控制器时,请记住将指针设置为nil,以免意外再次使用它。即
之类的东西[myLoginViewController release]; //!< Triggers the dealloc call
myLoginController = nil; //!< Makes sure we never use it again
或者,如果myLoginViewController是一个属性,你可以用更简洁的方式完成这个:
self.myLoginViewController = nil;
希望有所帮助,
萨姆
答案 1 :(得分:1)
注意-didReceiveMemoryWarning不会触发-dealloc,它会触发-viewDidUnload。所以我猜你的-viewDidUnload实现会做错误导致控制器的最终保留被释放,因此调用-dealloc。我刚刚在我的代码中遇到了这个问题,这是由-viewDidUnload中发布的保留回收引起的。
答案 2 :(得分:0)
这件事发生在我身上并花了一些时间才弄明白。其中一位代表试图发送消息,因为代表是自己的,这是一个强有力的参考。当我做弱的时候似乎已经解决了它。