1

长期以来,我一直认为自己是一个垃圾收集势利小人——尽管对 C++ 有着秘密的热爱,但我发现自己在嘲笑那些积极选择使用没有(阅读:缺失)垃圾收集的语言的开发人员。

然后我遇到了Objective-C。哇!它的引用计数系统看起来非常简单——我什至可以说是优雅的。在为 OSX 开发时,开发人员可以选择使用时髦的 GC;在为 iOS 开发时,开发人员被引用计数困住了。

我的问题是:

如果我正在开发一个可能被移植到 iOS 的 OSX 应用程序,Objective-C 的引用计数系统是否足够耗时(开发方面和错误修复方面)以保证在应用程序的第一个版本中忽略它?

如果我依赖引用计数*,我可能会遇到什么问题,假设我不够聪明,无法构建任何极其复杂的循环数据结构?有了类似的功能autorelease这一切看起来都那么简单,但我知道如果真的是这样,Apple 就不会投入精力来创建垃圾收集器。我应该注意什么?

* 我知道我可以使用垃圾收集器,即使我扔掉retains 和releases(它们会被忽略)。但是,考虑到非 GC 应用程序经常使用RAII,我不明白如果分代 GC 要“替换”对retainand的调用,那将如何工作release。资源不会延迟释放吗?

4

1 回答 1

1

我开发代码以移植到 iOS 的经验是,仅采用 GC 代码并将其反向移植到引用计数有点乏味且耗时,并且可能容易出错。话虽如此,只要您尽可能多地使用属性(即使在 GC 中没有任何区别,也让它们保留)并启用静态分析器构建阶段,这还不错。静态分析器将捕获大多数失败以遵守内存管理规则。如果你没有在dealloc中释放一个ivar,它不会注意到,但你可以通过系统地添加所有dealloc方法。

请记住,不能直接将Mac应用程序移植到iPhone上,MVC的VC部分必须完全重写,所以你可以采取只为垃圾收集编写Mac UI的方法,只使模型类兼容GC 和引用计数。

于 2011-01-05T10:08:34.267 回答