Objective-C中的引用计数注意事项? 艺龙网一直认为自己是一个垃圾收集势利小人——尽管我对C++有一种秘密的爱,但我发现自己嘲笑那些主动选择使用没有(读取:缺失)垃圾收集语言的开发人员。

Objective-C中的引用计数注意事项? 艺龙网一直认为自己是一个垃圾收集势利小人——尽管我对C++有一种秘密的爱,但我发现自己嘲笑那些主动选择使用没有(读取:缺失)垃圾收集语言的开发人员。,objective-c,garbage-collection,raii,reference-counting,Objective C,Garbage Collection,Raii,Reference Counting,然后我遇到了Objective-C。哇!它的参考计数系统似乎非常简单——我甚至可以说是优雅的。在为OSX开发时,开发人员可以选择使用时髦的GC;在为iOS开发时,开发人员必须进行引用计数 我的问题是: 如果我正在开发一个可能被移植到iOS上的OSX应用程序,Objective-C的引用计数系统是否足够耗时(从开发和bug修复的角度来看),足以保证在应用程序的第一个版本中忽略它 如果我依赖引用计数*,假设我不够聪明,无法构建任何极其复杂的循环数据结构,那么我可能会遇到什么问题?有了像自动释放之类的

然后我遇到了Objective-C。哇!它的参考计数系统似乎非常简单——我甚至可以说是优雅的。在为OSX开发时,开发人员可以选择使用时髦的GC;在为iOS开发时,开发人员必须进行引用计数

我的问题是: 如果我正在开发一个可能被移植到iOS上的OSX应用程序,Objective-C的引用计数系统是否足够耗时(从开发和bug修复的角度来看),足以保证在应用程序的第一个版本中忽略它

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


*我知道我可以使用垃圾收集器,即使我到处扔
retain
s和
release
s(它们将被忽略)。然而,考虑到非GC应用程序经常使用,我不明白如果一代GC“替换”对
retain
release
的调用,这将如何工作。资源是否可能会延迟发布?

我开发代码到iOS的经验是,只使用GC代码并将其向后移植到引用计数有点繁琐、耗时,而且可能容易出错。话虽如此,只要您尽可能多地使用属性(使它们保持不变,即使它在GC中没有任何区别),并且启用静态分析器构建阶段,就不会太糟糕。静态分析仪将捕获大多数故障,以遵守内存管理规则。如果您未能在dealloc中发布ivar,它不会注意到,但是您可以仔细检查并系统地添加所有dealloc方法


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

我开发代码到iOS的经验是,只使用GC代码并将其向后移植到引用计数有点繁琐、耗时,而且可能会出错有做…倾向的话虽如此,只要您尽可能多地使用属性(使它们保持不变,即使它在GC中没有任何区别),并且启用静态分析器构建阶段,就不会太糟糕。静态分析仪将捕获大多数故障,以遵守内存管理规则。如果您未能在dealloc中发布ivar,它不会注意到,但是您可以仔细检查并系统地添加所有dealloc方法


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

有点费时,但您不应该忽略它们尽最大努力,可能在第二个和第三个应用程序中您会真正得到它;)是时间投资在你身上。必须阅读:+1谢谢你的链接!明天早上我会读的。一旦你习惯了,它就会干净简单,不需要额外的努力。就像你说的,它真的很优雅。你几乎不需要处理自动释放池(这比在不再需要的时候释放内存效率要低),因为大多数东西都可以轻松地手动保留和释放。这是一个漂亮的链接!我将继续并在我的应用程序中实现引用计数。这有点费时,但你不应该忽视它们。尽你最大的努力,也许在第二个和第三个应用程序中你会真正得到它;)是时间投资在你身上。必须阅读:+1谢谢你的链接!明天早上我会读的。一旦你习惯了,它就会干净简单,不需要额外的努力。就像你说的,它真的很优雅。你几乎不需要处理自动释放池(这比在不再需要的时候释放内存效率要低),因为大多数东西都可以轻松地手动保留和释放。这是一个漂亮的链接!我将继续在我的应用程序中实现引用计数。