【问题标题】:does dealloc method being executed normally when quitting the application?退出应用程序时dealloc方法是否正常执行?
【发布时间】:2025-12-24 12:35:06
【问题描述】:

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

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

应用退出时永远不会调用此方法!为什么 ?有没有更好的地方来做我的清理工作?不被称为解决内存泄漏问题的事实?还是操作系统负责清理?

谢谢...

【问题讨论】:

标签: objective-c memory-leaks dealloc quit


【解决方案1】:

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

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

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

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

【讨论】:

  • 所有要释放的对象(或其他操作)都应该对应用程序的委托对象可见,对吧?是不是有点奇怪?
  • 不——一点也不奇怪。在应用程序中没有意义确保在终止之前内存是 free()d 的。从字面上看,这样做完全是浪费时间和电池寿命。
【解决方案2】:

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

【讨论】:

    【解决方案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
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我添加了断点等..但从未通过!我刚刚阅读了您链接的答案。 Xmmm 有趣!我将尝试调用“自定义清理方法”。我在我的-dealloc 中发布了一个线程,这就是我好奇的原因!我想确保它被取消并发布。有什么想法吗?
      • 在退出时肯定会调用 dealloc,即使没有调用,内核也应该回收被杀死进程的内存
      • 应用程序终止时无法保证调用dealloc。这在NSObject 类参考中有记录。
      • 到目前为止,我可以说“运行时系统可以简单地一次性释放所有剩余内存,而无需调用 dealloc 方法。”正如@e.James 所说。但是如果出于某种原因我们想让dealloc 被强制执行呢?有什么选择吗?
      最近更新 更多