free、dealloc、release 和 autorelease 有啥区别?

Posted

技术标签:

【中文标题】free、dealloc、release 和 autorelease 有啥区别?【英文标题】:What are the differences between free, dealloc, release, and autorelease?free、dealloc、release 和 autorelease 有什么区别? 【发布时间】:2011-03-21 02:31:33 【问题描述】:

有人能解释一下free()releaseautoreleasedealloc 之间的区别吗?

【问题讨论】:

【参考方案1】:

free() 是一个 C 函数,用于处理通过 malloc() 获得的不再需要的内存或其他记录要求 free() 释放其内存的函数,例如strdup().

-dealloc 是一个 Objective-C 选择器,当应用程序的任何部分不再拥有该对象时,它由 Objective-C 运行时发送给该对象。

-release 是您发送给对象的选择器,表示您正在放弃该对象的所有权。一旦一个对象不属于任何人,它就会由运行时发送-dealloc 消息。

-autorelease 是您发送给对象的选择器,表示您正在放弃该对象的所有权。但是,如果现在没有人拥有该对象,则最终的 -dealloc 将被推迟到某个未指定的稍后时间。事实上,你真正要做的是将你的所有权转移到一个自动释放池,然后在它本身被释放(或耗尽)时释放它。

除了对象自己的-dealloc 方法中的super 之外,您绝不能将-dealloc 发送给对象。

【讨论】:

【参考方案2】:

在您提到的 4 种方法中,您通常只会在 Objective-c 中使用 releaseautoreleasefree 可能在你使用过 c 和 malloc 时使用,否则你应该使用 releaseautorelease

dealloc 不应被您的任何代码调用,因为它会干扰 Objective-c 用于跟踪资源的保留/释放周期。如果您曾经使用过dealloc,几乎肯定会导致运行时崩溃。

releaseautorelease使用的终极资源是Apple memory management documentation

【讨论】:

【参考方案3】: freemalloc 的反面,用于 C 语言中。在 Objective C 编程中你可能不会经常使用它 如果您拥有一个对象,您可以在完成后release它 您也可以autorelease 一个对象。这会在当前运行循环迭代结束时自动释放它 当对象的引用计数降至零时,运行时调用dealloc。你不应该自己调用这个方法

如果您allocnewretaincopy,则您“拥有”一个对象。

Apple 在此提供some good documentation。

【讨论】:

第 3 点:我将其称为“运行循环迭代”而不是“运行循环”。第 4 点:当然,您的意思是说“dealloc”而不是“释放”,不是吗? (对不起,吹毛求疵) 非常感谢。这绝对有帮助。 我认为您需要更仔细地阅读您链接到的文档。您不拥有 init 的对象,您拥有使用 newalloc 或包含单词 copy 的方法创建的对象。您还拥有一个您保留的对象。 另外,自动释放的对象可能不会持续到 runloop 迭代结束。它只会持续到自动释放池耗尽。 通常这将在 runloop 迭代结束时,但您也可以创建新的自动释放池。 @Stephen 你确实拥有一个对象,如果你初始化或保留它,你拥有它,如果你新建、分配、保留或复制它。

以上是关于free、dealloc、release 和 autorelease 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone SDK:Dealloc 与 Release?

iPhone - dealloc - Release vs. nil

添加了 CAGradientLayer,在我的 UIView dealloc 中得到了这个:[CALayer release]: message sent to deallocated instanc

《Objective-C 高级编程》 1.2.3节 alloc/retain/release/dealloc 实现——学习总结

关于 dealloc/release:做 x = nil; 总是可以的吗? [x 发布]; - 或者它会导致问题吗?

-[UIKeyboardLayoutStar release]: message sent to deallocated instance