【问题标题】:Do I still need to learn about managing memory now that Objective-C/Cocoa has Garbage collection?既然 Objective-C/Cocoa 有垃圾收集,我还需要学习管理内存吗?
【发布时间】:2008-12-19 20:59:22
【问题描述】:

所以我终于把我的 Objective-C/Cocoa 书掸掉了……原来它们已经快 7 岁了! Objective-C 2.0 现在有了垃圾收集,内存管理的章节有多重要?

垃圾回收带来了多大的改变?

【问题讨论】:

    标签: objective-c cocoa macos garbage-collection


    【解决方案1】:

    理解内存管理仍然非常重要。如果您的目标是较旧的操作系统,则需要进行内存管理。如果您使用的是较旧的库,则需要进行内存管理。如果您下降到核心基础级别,您(可能会也可能不会)需要进行内存管理。

    如果您正在为 iPhone 编程,则需要进行内存管理。

    Objective-C 中的垃圾收集器非常出色——如果你可以使用它,你绝对应该使用它——但它还没有涵盖所有编程情况。

    【讨论】:

      【解决方案2】:

      一些 Cocoa 技术,例如分布式对象、PyObjC(Python-Objective-C 桥)插件和 CoreImage(至少我最近听说过;这可能已经修复)不能很好地与垃圾收集配合使用。如果您使用这些技术,您仍将不得不使用传统的内存管理。当然,正如其他人所说,如果您在代码中支持 OS X 10.4 或 iPhone,您仍然需要使用传统的 Cocoa 内存管理(引用计数)。

      另一方面,新的 GC 可以非常好。然而,这不是免费的午餐。您仍然需要了解 GC 系统的语义、其模式及其局限性……就像您了解任何技术一样。

      由于许多第三方框架可能还不支持 GC,因此最好还是了解引用计数系统。如果您遵循 Apple 的 memory management guide 中给出的简单的对象所有权规则,您应该总是可以的。

      【讨论】:

        【解决方案3】:

        如果你是在 iPhone 平台上编程,你需要知道 retain/release,因为 Cocoa Touch 没有 GC。

        如果您要使用 Core Foundation、Core Graphics、大多数核心服务或任何其他基于 CF 的 API,您需要了解保留/释放,因为 CF 派生对象默认情况下不会被 GC(无论如何,您必须明确地将它们放在外面以供取货)。

        如果您要使用任何 POSIX API 或任何其他核心服务,您需要了解分配/释放内存管理。你甚至没有得到引用计数。 (例外:Icon Services,它也有引用计数。从 Carbon 诞生的 API 是一团糟。)

        所以,一句话:是的。

        【讨论】:

          【解决方案4】:

          这取决于。如果您打算忽略 10.4 用户,那么您可能不必担心;但是 Objective-C 2.0 在 10.4 及更低版本上不可用,因此您仍然需要担心这些平台上的内存管理。

          也就是说,内存管理始终是一项有用的技能,而且在 Cocoa 中它并没有那么难,所以学习它并不是一个坏技能。

          【讨论】:

            【解决方案5】:

            可能值得学习支持 Cocoa 内存管理的概念,因为它在某些情况下仍然有用。例如,iPhone OS 不支持垃圾收集。可能在其他情况下使用手动内存管理是有利的,并且能够做出这种选择是很有用的

            【讨论】:

              【解决方案6】:

              了解 Cocoa 出色的内存管理概念将有助于您了解一般的内存管理概念。我已经将自动发布的概念复制到了几个 C++ 项目中,效果很好。 Apache 和 Subversion 是也使用自动发布的其他软件的示例。

              就我个人而言,我发现保留/释放/自动释放对我来说是正确的抽象级别。这不是魔法,所以如果我真的需要做一些奇怪的事情,很容易做到。另一方面,规则是如此简单,以至于它成为第二天性,以至于您最终不再考虑内存管理,它就可以工作。

              除此之外,如上所述,只有大部分 Cocoa 支持垃圾回收,而您正在编写的是 C,因此您编写和/或使用的任何不是 Cocoa 的代码都需要手动管理.这包括 CoreAudio、CoreGraphics 等。

              (是的,CF 对象与 GC 一起使用,但前提是您为每个对象显式启用它,而且我发现很难学习 GC-CF 规则)

              总结一下:我自己从不使用垃圾收集器(我唯一一次这样做非常痛苦,因为我混合了一些 C++ 和 CG),据我所知,大多数 Cocoa 编码器都非常用于保留/释放/自动释放并使用它。

              【讨论】:

                猜你喜欢
                • 2011-10-14
                • 1970-01-01
                • 2012-11-30
                • 1970-01-01
                • 2013-04-25
                • 2012-04-14
                • 2010-09-19
                • 2012-04-30
                • 1970-01-01
                相关资源
                最近更新 更多