【问题标题】:Reference-counting caveats in Objective-C?Objective-C 中的引用计数注意事项?
【发布时间】:2011-01-05 07:41:38
【问题描述】:

我一直认为自己是垃圾收集势利小人——尽管暗恋 C++,但我发现自己对那些积极选择使用没有(阅读:missing)垃圾收集的语言的开发人员嗤之以鼻。 '有选择权。

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

我的问题是:

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

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

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

【问题讨论】:

  • 有点费时,但你不应该忽视它们尽力而为,可能在第二个第三个应用程序中你会真正得到它;) 时间投入在你身上。必读:interfacelab.com/objective-c-memory-management-for-lazy-people
  • +1 感谢您的链接!明天早上我会读。
  • 一旦您习惯了它,它就会变得干净简单,并且几乎不需要额外的努力。就像你说的,它真的很优雅。您甚至很少需要处理自动释放池(它的内存效率低于在不再需要时释放的东西),因为大多数东西都可以轻松地手动保留和释放。
  • 那是一个漂亮的链接!我将继续并在我的应用程序中实现引用计数。

标签: objective-c garbage-collection raii reference-counting


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多