4

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

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

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

谢谢...

4

4 回答 4

10

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

这样做只是浪费CPU周期,浪费用户的时间。

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

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

于 2011-02-22T16:53:31.423 回答
3

这是 NSObject Reference 中的引述:“重要提示:请注意,当应用程序终止时,可能不会向对象发送 dealloc 消息,因为进程的内存在退出时会自动清除——让操作系统清理资源比简单地清理资源更有效。调用所有内存管理方法。” 这几乎印证了很多人所说的。

于 2011-09-02T23:52:52.040 回答
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
}
于 2013-06-03T14:21:16.073 回答
-1

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

于 2011-02-22T14:50:26.177 回答