iPhone:在parentViewController上调用dealloc会导致异常

时间:2010-03-03 10:36:33

标签: iphone dealloc parentviewcontroller

我正在处理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]行,则不会抛出异常并且我的应用程序仍在运行。

再次感谢您的帮助!

3 个答案:

答案 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)

这件事发生在我身上并花了一些时间才弄明白。其中一位代表试图发送消息,因为代表是自己的,这是一个强有力的参考。当我做弱的时候似乎已经解决了它。