8

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

垃圾收集有多大的不同?

4

6 回答 6

9

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

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

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

于 2008-12-19T21:24:23.257 回答
3

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

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

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

于 2008-12-19T21:33:30.087 回答
3

如果你正在编写 iPhone 平台,你需要知道保留/释放,因为 Cocoa Touch 没有 GC。

如果您打算使用 Core Foundation、Core Graphics、大多数 Core Services 或任何其他基于 CF 的 API,您需要了解保留/释放,因为 CF 派生对象默认情况下不会被 GC(并且您必须无论如何,明确地把它们拿出来取走)。

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

所以,一句话:是的。

于 2008-12-20T01:54:31.073 回答
2

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

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

于 2008-12-19T21:21:31.623 回答
2

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

于 2008-12-19T21:25:27.357 回答
1

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

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

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

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

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

于 2008-12-21T12:25:13.733 回答