为啥保留/释放而不是新/删除?

Posted

技术标签:

【中文标题】为啥保留/释放而不是新/删除?【英文标题】:Why retain/release rather than new/delete?为什么保留/释放而不是新/删除? 【发布时间】:2011-06-27 14:13:46 【问题描述】:

我是 Objective-C 的新手,我觉得在 C++ 中很合适。

我的问题是: 为什么 obj-c 的语言设计器适合使用 retain/release 而不是只使用 new/delete(=alloc/dealloc)?

也许我的大脑只适合新/删除内存管理,我不明白为什么我应该管理引用计数,我想我知道什么时候对象必须根据我的 C++ 经验分配/释放。

(是的,我花了4个小时调试引用计数问题,通过1行“release”解决)

谁能解释一下当我们使用引用计数器时什么更好? (在编程语言方面)我认为我可以通过新建/删除来管理对象的生命周期,但我不能使用引用计数。

如果您有链接,我需要长篇文章来解释为什么引用计数器很有用。

P.S:我在 WWDC 2011 上听说过 Compile-time Automatic Reference Counting,它真的很棒,例如可能是因为使用了引用计数器。

【问题讨论】:

我不确定您的问题是否有客观答案(双关语是半有意的)。我不认为有一个 Obj-C 程序员会毫无保留地为引用计数辩护——老实说,这是一个皇家 PITA。我会推荐 Xcode 4 中的代码分析器(Product->Profile),以节省您修复引用计数问题和过早发布的时间(双关语绝对不是有意的)。祝你好运! 【参考方案1】:

简短的回答是,它是一种管理对象生命周期的方法,而无需像使用 C++ 那样需要“所有权”。

在 C++ 中使用new 创建对象时,必须知道稍后何时delete 该对象。这通常很简单,但是当一个对象可以被许多具有不同生命周期的不同“所有者”传递和共享时,这可能会很困难。

使用引用计数,只要任何其他对象引用该对象,它就会保持活动状态。当所有其他对象删除它们的引用时,它就会消失。这种方法有一些缺点(保留/释放和引用周期的调试最为明显),但它是全自动垃圾收集的有用替代方案。

Objective-C 不是唯一使用引用计数的语言。在 C++ 中,通常使用std::shared_ptr,这是标准的引用计数智能指针模板。 Windows 组件对象模型编程需要它。许多语言在后台使用自动引用计数作为垃圾收集策略。

***文章是开始寻找更多信息的好地方:http://en.wikipedia.org/wiki/Reference_counting

【讨论】:

感谢您的回答,我真的明白什么是对象分配/解除分配的“所有权”。无论如何,有人可以让我知道自动引用计数是如何工作的吗? (或阅读有用的材料。)我真的可以想象它如何在编译时工作! 目前唯一公开的关于 ARC 的信息位于 LLVM 网站:clang.llvm.org/docs/AutomaticReferenceCounting.html。如果您是 Apple 开发者计划的成员,您可以阅读 NDA 信息并在开发者网站上观看 WWDC 会议。

以上是关于为啥保留/释放而不是新/删除?的主要内容,如果未能解决你的问题,请参考以下文章

保留周期:为啥这是一件坏事?

为啥编译器保留一点堆栈空间而不是整个数组大小?

为啥编译器保留一点堆栈空间而不是整个数组大小?

[NSDecimalNumber 保留]:消息发送到已释放实例 0x174222220,但为啥呢?

为啥在 Swift 中的铸造成本如此之高,而不是……将其保留为 AnyObject?

为啥保留循环泄漏内存?