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