【发布时间】:2010-09-25 17:30:32
【问题描述】:
是否需要在程序退出/关闭时释放对象?
换句话说,为了争论,您有一个关闭应用程序的按钮,但在您关闭之前显示图像,然后关闭应用程序。
您是否需要在关闭应用程序之前释放该图像视图?程序退出时内存会自动释放吗,或者如果您不释放它,内存会以某种方式保持“活动”状态?
我知道你“应该”发布它,我的问题是关于它的技术方面,以及幕后发生的事情。
【问题讨论】:
标签: objective-c cocoa cocoa-touch
是否需要在程序退出/关闭时释放对象?
换句话说,为了争论,您有一个关闭应用程序的按钮,但在您关闭之前显示图像,然后关闭应用程序。
您是否需要在关闭应用程序之前释放该图像视图?程序退出时内存会自动释放吗,或者如果您不释放它,内存会以某种方式保持“活动”状态?
我知道你“应该”发布它,我的问题是关于它的技术方面,以及幕后发生的事情。
【问题讨论】:
标签: objective-c cocoa cocoa-touch
发布可以帮助您发现错误。动态内存问题通常在释放时触发(例如,您尝试释放无效对象)。始终发布可以帮助您发现原本很难找到的错误。
【讨论】:
在 iPhone 上,您不需要,而且据我所知,您不能。收到 applicationWillTerminate: 您有几秒钟的时间来保存您的状态,然后操作系统会终止您的进程。构建一个示例应用程序并在其中一个 dealloc 方法中放置一个断点。他们永远不会被击中。
这是一个巨大的争论:link text
注意:Objective C dealloc 与 C++ Deconstructor 不同。在 Deconstructor 中,您可以关闭文件、句柄等。在 Objective C 中,dealloc 仅用于释放内存。您必须提前关闭其他资源,因为可能永远不会调用 dealloc。
【讨论】:
确实没有必要,但如果您可能想回收一些源代码并在另一个程序中使用它,您可能会遇到内存泄漏。此外,永远不要认为操作系统没有任何错误。它可能会“忘记”释放一些资源。
【讨论】:
没必要。但是,如果您使用valgrind 或类似工具,您很快就会发现,让所有的记忆悬而未决会让您收到错误的警告。
在 Linux 方面,堆是使用 sbrk 系统调用增长的。这一次将整个处理器内存空间增加一个大块(因此只需要一个sbrk 就可以为许多mallocs 提供足够的空间)。当进程消失时,内核回收sbrk 分配的所有内存。这就是你安全的原因。内核还将关闭该进程打开的所有文件描述符。
可能会出现一些问题。如果您的进程在不合时宜的时刻forks,任何打开的文件描述符都将被复制。我已经看到这表现为一个 TCP 连接在原始进程死亡后神秘地挂起,这是讨厌。此外,还有其他资源不是进程范围的,因此当进程终止时它们不会被回收。这包括共享内存段、临时文件、命名管道和 UNIX 套接字,可能还有许多其他 IPC 机制。
总结一下?记忆力很好。文件描述符通常很好。如果不清理,一些更深奥的 IPC 功能将被严重破坏。
【讨论】: