是否需要在程序退出时释放对象?

时间:2008-12-07 07:02:09

标签: objective-c cocoa cocoa-touch

是否需要在程序退出/关闭时释放对象?

换句话说,让我们说为了论证,你有一个关闭你的应用程序的按钮,但在你关闭之前你显示一个图像,然后你关闭应用程序。

在关闭应用程序之前,是否需要发布该图像视图?程序退出时是否会自动释放内存,或者如果你不释放它,内存会以某种方式“活动”吗?

我知道你“应该”发布它,我的问题是它的技术方面,以及幕后发生的事情。

4 个答案:

答案 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)

发布可以帮助您找到错误。通常情况下,动态内存问题会在发布时触发(例如,您尝试释放无效对象)。始终发布可以帮助您识别本来难以找到的错误。