由于UIViewController的[super dealloc]导致内存崩溃

3
我有一个 `uiviewcontroller` 实例,当我释放它时,它的 dealloc 方法被调用。
在 `uiviewcontroller` 的 dealloc 方法中,我释放了一些对象。
如果我注释掉 `[super dealloc]`,则应用程序正常运行,但如果不这样做,则会崩溃。
我认为在这个方法中释放的对象没有问题,但如果我执行 `[super dealloc]` 就会崩溃。
有人可以帮我解决这个问题吗?

你能否在调试器控制台上发布错误消息? - Morion
你能否发布包含 [super dealloc] 的 dealloc 方法? - richleland
3个回答

4
很难根据您的帖子获得更多信息,但是您的dealloc方法是否看起来像这样?
- (void)dealloc {

    [super dealloc];

    self.someProperty = nil;
}

因为如果这样做,你就在一个已释放的实例上调用了setter方法。你应该总是最后调用[super dealloc]:

- (void)dealloc {

    self.someProperty = nil;

    [super dealloc];

}

不确定这是否有所帮助。如果没有,请尝试发布您的dealloc方法是什么样子的。在黑暗中进行故障排除很困难。


4
dealloc 中不应该访问属性,这被认为是一种糟糕的实践方式,因为你正在重新进入正在被释放的对象。相反,应该这样做:[someProperty release], someProperty = nil; - Andrew Ebling

1

没有更多的信息,我们无法帮助您。您所描述的代码是完全正常的。问题可能出现在应用程序的其他部分。

您可能在释放后访问了视图控制器,因此问题不在于[super dealloc],而是在于应用程序中访问视图控制器的任何其他位置。


这也是我的第一想法。如果不调用 super dealloc,你的对象就不能被释放,而其他糟糕的代码仍能正常运行。当你取消对 super 调用的注释时,错误就会再次出现。 - Alex Gosselin

0

也许你在错误的位置释放了控制器。这可能是为什么你的 ViewController.m 中的 [super dealloc] 会崩溃的原因。

在你想让控制器死亡之前,你不应该调用 [viewController release]。例如,如果你的应用程序只有一个视图控制器,那么在应用程序结束之前,你不能释放它。这是因为该控制器需要始终保持活动状态以控制视图。如果你在 ApplicationDelegate 中有类似下面的代码,它将会崩溃:

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

你应该将你的视图控制器放在头文件 (.h) 中,并在 dealloc 方法中释放它,而不是这样做:

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

我希望这可以帮助到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接