【发布时间】:2011-03-21 02:31:33
【问题描述】:
有人能解释一下free()、release、autorelease 和dealloc 之间的区别吗?
【问题讨论】:
标签: objective-c c cocoa-touch memory-management
有人能解释一下free()、release、autorelease 和dealloc 之间的区别吗?
【问题讨论】:
标签: objective-c c cocoa-touch memory-management
free() 是一个 C 函数,用于处理通过 malloc() 获得的不再需要的内存或其他记录要求 free() 释放其内存的函数,例如strdup().
-dealloc 是一个 Objective-C 选择器,当应用程序的任何部分不再拥有该对象时,它由 Objective-C 运行时发送给该对象。
-release 是您发送给对象的选择器,表示您正在放弃该对象的所有权。一旦一个对象不属于任何人,它就会由运行时发送-dealloc 消息。
-autorelease 是您发送给对象的选择器,表示您正在放弃该对象的所有权。但是,如果现在没有人拥有该对象,则最终的 -dealloc 将被推迟到某个未指定的稍后时间。事实上,你真正要做的是将你的所有权转移到一个自动释放池,然后在它本身被释放(或耗尽)时释放它。
除了对象自己的-dealloc 方法中的super 之外,您绝不能将-dealloc 发送给对象。
【讨论】:
在您提到的 4 种方法中,您通常只会在 Objective-c 中使用 release 和 autorelease。 free 可能在你使用过 c 和 malloc 时使用,否则你应该使用 release 和 autorelease。
dealloc 不应被您的任何代码调用,因为它会干扰 Objective-c 用于跟踪资源的保留/释放周期。如果您曾经使用过dealloc,几乎肯定会导致运行时崩溃。
release和autorelease使用的终极资源是Apple memory management documentation
【讨论】:
free 是 malloc 的反面,用于 C 语言中。在 Objective C 编程中你可能不会经常使用它release它autorelease 一个对象。这会在当前运行循环迭代结束时自动释放它dealloc。你不应该自己调用这个方法如果您alloc、new、retain 或copy,则您“拥有”一个对象。
Apple 在此提供some good documentation。
【讨论】:
init 的对象,您拥有使用 new、alloc 或包含单词 copy 的方法创建的对象。您还拥有一个您保留的对象。