【问题标题】:Memory Crash due to [super dealloc] of uiview controller由于 uiview 控制器的 [super dealloc] 导致内存崩溃
【发布时间】:2009-10-30 11:56:47
【问题描述】:

我有一个uiviewcontroller 实例,当我释放它时,会调用它的 dealloc 方法。

我已经在 uiviewcontroller 的 dealloc 方法中释放了一些对象。

如果我评论 [super dealloc] 应用程序运行正常,但如果不这样做,它就会崩溃。

我认为我在该方法中所做的发布没有问题,但如果我这样做 [super dealloc] 它会崩溃。

谁能帮我解决这个问题?

【问题讨论】:

  • 你能从调试器控制台发布错误信息吗?
  • 你能发布包含 [super dealloc] 的 dealloc 方法吗?

标签: iphone objective-c ios crash


【解决方案1】:

如果没有更多信息,很难从您的帖子中看出,但是您的 dealloc 方法看起来像这样吗?

- (void)dealloc {

    [super dealloc];

    self.someProperty = nil;
}

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

- (void)dealloc {

    self.someProperty = nil;

    [super dealloc];

}

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

【讨论】:

  • 您不应该在 dealloc 中访问类似的属性 - 这被认为是不好的做法,因为您正在重新输入正在被释放的对象。你应该这样做:[someProperty release], someProperty = nil;
【解决方案2】:

如果没有更多信息,我们无法为您提供帮助。您描述的代码非常好。问题出在应用的其他部分。

您可能会在释放视图控制器后访问它,所以问题不在于[super dealloc],而是您应用程序中访问视图控制器的任何其他地方。

【讨论】:

  • 这也是我的第一个想法。当不调用 super dealloc 时,您的对象不会得到 dealloc'd 并且其他地方的错误代码仍然可以工作。当您取消注释超级调用时,错误又回来了。
【解决方案3】:

也许你在错误的地方释放了控制器。这可能就是你的 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];
}

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多