退出应用程序时dealloc方法是否正常执行?

时间:2011-02-22 14:45:26

标签: objective-c memory-leaks dealloc quit

我使用以下代码(例如我的appController.m内部)在我的应用程序终止时进行一些清理......

- (void) dealloc {
    [myObject release]; // myObject 's dealloc will not be called either !!!
    [arraySMSs release];
    [super dealloc];
}

当应用程序退出时,永远不会调用此方法!为什么?有没有更好的地方来清理?没有调用的事实解决了内存泄漏问题?或者操作系统确实负责清理?

谢谢...

4 个答案:

答案 0 :(得分:8)

系统没有理由确保在应用程序终止时单独释放每个对象。

这样做只会浪费CPU周期并浪费用户的时间。

当应用程序终止时,系统将以完全自动且不可避免的方式回收该应用程序使用的所有资源。

如果您需要在应用程序终止时发生某些事情,请使用应用程序委托的钩子来执行此操作。但不要依赖于此。用户可能会强行重启设备或强行退出应用程序。

答案 1 :(得分:3)

好的问题,我也很困惑。

现在我明白了:

说没有由我们的自定义代码管理的对象欠appDelegate类本身,我们并不需要担心“释放”它的实例。 UIApplication是唯一保留它的类,但我们不欠它。

但是,对于学术讨论或者目前我还不知道有什么目的, 当你想在appDelegate类中测试dealloc:

applicationWillTerminate是了解您的应用是否会退出的正确位置。

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    [UIApplication sharedApplication].delegate = nil;
    // after this, the dealloc method of our appDelegate class will be called
}

答案 2 :(得分:2)

以下是NSObject Reference的引用: “重要说明:请注意,当应用程序终止时,可能不会向对象发送dealloc消息,因为进程的内存在退出时自动清除 - 仅仅允许操作系统清理资源比调用所有内存管理方法更有效“。 它几乎证实了许多人所说的话。

答案 3 :(得分:-1)

是什么让你认为dealloc没有被调用?你运行这个是调试器吗?请参阅此问题,了解为什么您不一定能够在dealloc方法中调用NSLog:when is dealloc executed?