在OS X 10.5+环境中编写相当典型的Mac代码时,使用垃圾收集有哪些缺点?
到目前为止,我写的所有其他内容都是10.4兼容或者在iPhone上,所以我对保留/发布变得相当舒服,但现在我正在开发一个更大的项目,只有10.5我只是想知道是否存在是继续使用Objective-C 2.0垃圾收集器的任何缺点。
你们有什么感想?
在OS X 10.5+环境中编写相当典型的Mac代码时,使用垃圾收集有哪些缺点?
到目前为止,我写的所有其他内容都是10.4兼容或者在iPhone上,所以我对保留/发布变得相当舒服,但现在我正在开发一个更大的项目,只有10.5我只是想知道是否存在是继续使用Objective-C 2.0垃圾收集器的任何缺点。
你们有什么感想?
如果您正在编写新的Cocoa代码并以Mac OS X 10.5为目标,请使用Objective-C垃圾回收。
如果您正在编写可能还需要在iPhone上运行的代码,您可以编写 并测试 通过将代码保存在单独的框架中,使用属性编写代码,可以非常轻松地为这两个模型编写代码 -retain
和 -release
使用,并设置框架和单元测试目标 GC-支持 而不是 GC-只。
Xcode将运行您的单元测试包两次,一次启用GC,一次关闭GC,您的框架将在两种执行模型下运行。然后,如果您最终想要将该模型级代码带到iPhone,您可以将其放在以iPhone为目标的静态库中,或直接将其包含在iPhone项目中。
但是,无论您是否考虑在iPhone上运行代码,如果您的应用程序需要Leopard,您肯定应该定位垃圾收集。它将简化开发,Objective-C垃圾收集器的性能非常好。
如果有可能将您的应用程序移植到iPhone,则不应使用它。
垃圾收集 威力 如果您有特殊用例,会对性能产生负面影响。如果没有GC,您可以精确控制对象的破坏,这不是GC世界的情况。在大多数项目中,打开GC是值得的,因为它不易出错且更容易。
在 理论没有GC的内存管理总是比使用GC更快,但是,在大多数实际应用中并非如此(因为GC通常比人类更优化)。
如果您正在编写新的Cocoa代码并以Mac OS X 10.5为目标,请使用Objective-C垃圾回收。
如果您正在编写可能还需要在iPhone上运行的代码,您可以编写 并测试 通过将代码保存在单独的框架中,使用属性编写代码,可以非常轻松地为这两个模型编写代码 -retain
和 -release
使用,并设置框架和单元测试目标 GC-支持 而不是 GC-只。
Xcode将运行您的单元测试包两次,一次启用GC,一次关闭GC,您的框架将在两种执行模型下运行。然后,如果您最终想要将该模型级代码带到iPhone,您可以将其放在以iPhone为目标的静态库中,或直接将其包含在iPhone项目中。
但是,无论您是否考虑在iPhone上运行代码,如果您的应用程序需要Leopard,您肯定应该定位垃圾收集。它将简化开发,Objective-C垃圾收集器的性能非常好。
如果有可能将您的应用程序移植到iPhone,则不应使用它。
垃圾收集 威力 如果您有特殊用例,会对性能产生负面影响。如果没有GC,您可以精确控制对象的破坏,这不是GC世界的情况。在大多数项目中,打开GC是值得的,因为它不易出错且更容易。
在 理论没有GC的内存管理总是比使用GC更快,但是,在大多数实际应用中并非如此(因为GC通常比人类更优化)。
我更喜欢自己处理内存管理,仅仅因为我喜欢这种级别的控制。我从其他语言(C#)的经验中了解到GC不允许你完全忽略内存问题,并且在Cocoa中使用弱引用和回调使用(void *)这样的事情是相同的,其中对象未明确拥有另一个对象。你基本上是为另一组挑战(内存泄漏)。就个人而言,这些天我并不倾向于犯太多内存管理错误,而我所做的那些错误很容易被追踪。
在某些情况下(例如为NSOutlineView实现数据源方法,你不想保留提供给大纲视图的对象)我认为GC会非常有帮助,但我还没有做过用它进行真正的测试。
Apple列出了其他一些优点和缺点 GC编程指南。
GC从10.8开始不推荐使用。采用这种技术实际上从来都不是一个好主意,因为性能和稳定性目标从未得到满足。
“手动”管理内存实际上非常简单,因为管理代码可以在很大程度上被考虑在内。我的代码库有<1%与内存管理相关的代码,并且比它需要的代码大。所以我也对ARC持怀疑态度,因为它所解决的问题是如此之小,以至于即使是相当小的技术问题使得它也不值得。