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()
、release
、autorelease
和dealloc
之间的区别吗?
【问题讨论】:
【参考方案1】:free()
是一个 C 函数,用于处理通过 malloc()
获得的不再需要的内存或其他记录要求 free() 释放其内存的函数,例如strdup()
.
-dealloc
是一个 Objective-C 选择器,当应用程序的任何部分不再拥有该对象时,它由 Objective-C 运行时发送给该对象。
-release
是您发送给对象的选择器,表示您正在放弃该对象的所有权。一旦一个对象不属于任何人,它就会由运行时发送-dealloc
消息。
-autorelease
是您发送给对象的选择器,表示您正在放弃该对象的所有权。但是,如果现在没有人拥有该对象,则最终的 -dealloc
将被推迟到某个未指定的稍后时间。事实上,你真正要做的是将你的所有权转移到一个自动释放池,然后在它本身被释放(或耗尽)时释放它。
除了对象自己的-dealloc
方法中的super
之外,您绝不能将-dealloc
发送给对象。
【讨论】:
【参考方案2】:在您提到的 4 种方法中,您通常只会在 Objective-c 中使用 release
和 autorelease
。 free
可能在你使用过 c 和 malloc
时使用,否则你应该使用 release
和 autorelease
。
dealloc
不应被您的任何代码调用,因为它会干扰 Objective-c 用于跟踪资源的保留/释放周期。如果您曾经使用过dealloc
,几乎肯定会导致运行时崩溃。
release
和autorelease
使用的终极资源是Apple memory management documentation
【讨论】:
【参考方案3】:free
是 malloc
的反面,用于 C 语言中。在 Objective C 编程中你可能不会经常使用它
如果您拥有一个对象,您可以在完成后release
它
您也可以autorelease
一个对象。这会在当前运行循环迭代结束时自动释放它
当对象的引用计数降至零时,运行时调用dealloc
。你不应该自己调用这个方法
如果您alloc
、new
、retain
或copy
,则您“拥有”一个对象。
Apple 在此提供some good documentation。
【讨论】:
第 3 点:我将其称为“运行循环迭代”而不是“运行循环”。第 4 点:当然,您的意思是说“dealloc”而不是“释放”,不是吗? (对不起,吹毛求疵) 非常感谢。这绝对有帮助。 我认为您需要更仔细地阅读您链接到的文档。您不拥有init
的对象,您拥有使用 new
、alloc
或包含单词 copy
的方法创建的对象。您还拥有一个您保留的对象。
另外,自动释放的对象可能不会持续到 runloop 迭代结束。它只会持续到自动释放池耗尽。 通常这将在 runloop 迭代结束时,但您也可以创建新的自动释放池。
@Stephen 你确实不拥有一个对象,如果你初始化或保留它,你拥有它,如果你新建、分配、保留或复制它。以上是关于free、dealloc、release 和 autorelease 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
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