1

我正在处理 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 Simulator 上模拟内存警告,则会引发以下异常:

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

再次感谢您的帮助!

4

3 回答 3

2

看起来您正在释放您的视图控制器,但随后又尝试再次使用它。当您因为内存警告而释放视图控制器时,请记住将指针设置为 nil,这样您就不会意外地再次使用它。即类似的东西

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

或者,如果 myLoginViewController 是一个属性,您可以以更简洁的方式执行此操作:

self.myLoginViewController = nil;

希望有帮助,

山姆

于 2010-03-03T11:31:24.793 回答
1

注意 -didReceiveMemoryWarning 不会触发 -dealloc,它会触发 -viewDidUnload。所以我猜是你的 -viewDidUnload 实现做错了导致控制器的最终保留被释放,所以 -dealloc 被调用。我刚刚在我的代码中遇到了这个问题,这是由 -viewDidUnload 中释放的保留回收引起的。

于 2010-09-01T20:53:20.353 回答
0

这发生在我身上,花了一段时间才弄清楚。其中一位代表试图发送消息,因为该代表是自我,并且是强引用。当我让它变弱时,它似乎已经修复了它。

于 2013-01-03T21:32:52.153 回答