【发布时间】:2008-12-19 20:59:22
【问题描述】:
所以我终于把我的 Objective-C/Cocoa 书掸掉了……原来它们已经快 7 岁了! Objective-C 2.0 现在有了垃圾收集,内存管理的章节有多重要?
垃圾回收带来了多大的改变?
【问题讨论】:
标签: objective-c cocoa macos garbage-collection
所以我终于把我的 Objective-C/Cocoa 书掸掉了……原来它们已经快 7 岁了! Objective-C 2.0 现在有了垃圾收集,内存管理的章节有多重要?
垃圾回收带来了多大的改变?
【问题讨论】:
标签: objective-c cocoa macos garbage-collection
理解内存管理仍然非常重要。如果您的目标是较旧的操作系统,则需要进行内存管理。如果您使用的是较旧的库,则需要进行内存管理。如果您下降到核心基础级别,您(可能会也可能不会)需要进行内存管理。
如果您正在为 iPhone 编程,则需要进行内存管理。
Objective-C 中的垃圾收集器非常出色——如果你可以使用它,你绝对应该使用它——但它还没有涵盖所有编程情况。
【讨论】:
一些 Cocoa 技术,例如分布式对象、PyObjC(Python-Objective-C 桥)插件和 CoreImage(至少我最近听说过;这可能已经修复)不能很好地与垃圾收集配合使用。如果您使用这些技术,您仍将不得不使用传统的内存管理。当然,正如其他人所说,如果您在代码中支持 OS X 10.4 或 iPhone,您仍然需要使用传统的 Cocoa 内存管理(引用计数)。
另一方面,新的 GC 可以非常好。然而,这不是免费的午餐。您仍然需要了解 GC 系统的语义、其模式及其局限性……就像您了解任何技术一样。
由于许多第三方框架可能还不支持 GC,因此最好还是了解引用计数系统。如果您遵循 Apple 的 memory management guide 中给出的简单的对象所有权规则,您应该总是可以的。
【讨论】:
如果你是在 iPhone 平台上编程,你需要知道 retain/release,因为 Cocoa Touch 没有 GC。
如果您要使用 Core Foundation、Core Graphics、大多数核心服务或任何其他基于 CF 的 API,您需要了解保留/释放,因为 CF 派生对象默认情况下不会被 GC(无论如何,您必须明确地将它们放在外面以供取货)。
如果您要使用任何 POSIX API 或任何其他核心服务,您需要了解分配/释放内存管理。你甚至没有得到引用计数。 (例外:Icon Services,它也有引用计数。从 Carbon 诞生的 API 是一团糟。)
所以,一句话:是的。
【讨论】:
这取决于。如果您打算忽略 10.4 用户,那么您可能不必担心;但是 Objective-C 2.0 在 10.4 及更低版本上不可用,因此您仍然需要担心这些平台上的内存管理。
也就是说,内存管理始终是一项有用的技能,而且在 Cocoa 中它并没有那么难,所以学习它并不是一个坏技能。
【讨论】:
可能值得学习支持 Cocoa 内存管理的概念,因为它在某些情况下仍然有用。例如,iPhone OS 不支持垃圾收集。可能在其他情况下使用手动内存管理是有利的,并且能够做出这种选择是很有用的
【讨论】:
了解 Cocoa 出色的内存管理概念将有助于您了解一般的内存管理概念。我已经将自动发布的概念复制到了几个 C++ 项目中,效果很好。 Apache 和 Subversion 是也使用自动发布的其他软件的示例。
就我个人而言,我发现保留/释放/自动释放对我来说是正确的抽象级别。这不是魔法,所以如果我真的需要做一些奇怪的事情,很容易做到。另一方面,规则是如此简单,以至于它成为第二天性,以至于您最终不再考虑内存管理,它就可以工作。
除此之外,如上所述,只有大部分 Cocoa 支持垃圾回收,而您正在编写的是 C,因此您编写和/或使用的任何不是 Cocoa 的代码都需要手动管理.这包括 CoreAudio、CoreGraphics 等。
(是的,CF 对象与 GC 一起使用,但前提是您为每个对象显式启用它,而且我发现很难学习 GC-CF 规则)
总结一下:我自己从不使用垃圾收集器(我唯一一次这样做非常痛苦,因为我混合了一些 C++ 和 CG),据我所知,大多数 Cocoa 编码器都非常用于保留/释放/自动释放并使用它。
【讨论】: