为什么要排空自动释放池而不是释放它?

3
为什么要排空自动释放池而不是释放它呢?
2个回答

5

一个原因是为了垃圾回收(iPhone 上不可用)

启用 GC 后,release 是无效的,但 drain 提供了给垃圾回收器的提示

来自 文档:

垃圾回收

在垃圾回收环境中,不需要自动释放池。但是,您可能会编写旨在在垃圾回收和引用计数环境中工作的框架。在这种情况下,可以使用自动释放池来提示收集可能是适当的。在垃圾回收环境中,向池发送 drain 消息会在必要时触发垃圾回收;但 release 是无效的。在引用计数环境中,drain 与 release 具有相同的效果。因此,通常应使用 drain 而不是 release。


2
很久以前, drain 和 release 是分开的。你必须先调用 drain,然后再调用 release。但由于你总是先 drain 再 release,所以它们被合并成了 drain。我认为他们保留了 drain,因为手动内存管理曾经非常重要,你需要能够在代码中准确地找到池的消耗位置。 - TechZen
什么?-drain是在10.4 SDK中添加的,特别是为了垃圾回收兼容性。 (垃圾回收在10.4中不可用,但部分基础工作已完成。) 必须以这种方式完成,因为无法在GC中覆盖-release - Jens Ayton
在iPhone的情况下,这是一个糟糕的答案。请查看我的答案以获取更好使用"drain"的原因。 - Stefan Arentz
@TechZen:那是一个Cocoa的传说。正如Ahruman所指出的,drain在10.4中被添加为release的同义词。这两个同义方法的原因是,苹果公司的GC实现使release成为无操作,因此如果他们想要该方法在GC和MM环境下都能工作,就需要使用不同的选择器。 - Chuck

-2

这里最好的答案是“因为苹果公司告诉你这样做”。

遵循苹果公司的“最佳实践”是提高向前兼容性的最佳方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接