iOS 5有垃圾收集吗?

NSE*_*rer 21 iphone objective-c ios ios5

我不再需要担心iOS 5以后的内存管理吗?是否所有为iOS 4及更早版本编写的程序都必须重写以允许iOS为您管理内存?

Chu*_*uck 39

您似乎在谈论自动引用计数,在其他答案中提到.ARC是一种GC,它可以自动释放内存,但与良好的垃圾收集器有许多不同之处.

首先,它主要是编译器技术.编译器知道Cocoa的引用计数指南,因此它根据规则插入保留和释放的位置.它的工作方式就像你自己编写保留和释放一样 - 它只是为你插入它们.普通垃圾收集器在运行时跟踪程序的内存.

其次,因为它就像保留和释放一样,它不能捕获保留周期(如果对象A保留对象B并且对象B保留对象A,并且没有其他任何引用它们,它们都变成不朽的).您需要采取相同的预防措施来防止它们.

它还使用与自动垃圾收集器不同的资源.与Objective-C一起使用的垃圾收集器必须扫描未引用的内存并收集它 - 这是昂贵的,并且可能导致在较慢的系统上"口吃" - 但它们只需偶尔这样做,理论上甚至可以微调它们的收集周期与程序实际使用其内存的方式相匹配.通常,GC程序将使用比非GC程序更多的内存,并且当GC决定收集时将显着减慢.另一方面,ARC将"扫描"移动到编译时并在内存可用时立即释放内存,但它必须不断更新对象引用计数,而不是等待垃圾像收集器一样构建.

  • @Yar:它将启用哪些版本的细节属于NDA,很可能会发生变化,但它是编译器功能和实现某些功能的运行时库(特别是弱引用)的组合.目前有两种使用ARC的方法:1)从iOS开发者程序中获取Xcode 4.2; 或2)自己下载最新版本的LLVM并将其用作编译器. (2认同)

Sop*_*ert 23

在Apple的公共iOS 5页面上,他们声明:

自动参考计数

Objective-C的自动引用计数(ARC)使内存管理成为编译器的工作.通过使用新的Apple LLVM编译器启用ARC,您将永远不需要再次键入retain或release,从而大大简化了开发过程,同时减少了崩溃和内存泄漏.编译器完全了解您的对象,并在不再使用它的瞬间释放每个对象,因此应用程序运行速度与以往一样快,具有可预测的平滑性能.

这是一个编译器功能; 不是操作系统功能,所以我不明白为什么它不适用于旧版本.

  • 不,它比垃圾收集更好.编译器知道需要释放什么以及什么时候发布,所以所有内存管理都要小心,就像你自己做的那样.比GC更高效,因为它在应用程序运行时不使用资源. (5认同)
  • 扩展Josh的观点,如果你有一个周期性的对象,这将无济于事 - 也就是说,对于最简单的情况,2个对象引用彼此而没有其他任何引用它们的对象.它们的引用计数永远不会减少到零,因此它们不会被删除._Edit:@Brandon:部分原因我们使用GC:p_ (5认同)
  • @Brandon,*编译器知道需要发布什么以及什么时候发布,所以所有的内存管理都要好像你自己做的那样.*你的意思是它也处理w /循环引用吗?无论哪种方式,参考.计数比一个好的垃圾收集器慢,而且对多线程代码来说速度很慢. (5认同)
  • 那不是垃圾收集. (4认同)
  • @Yar:ARC仍然是引用计数 - 它只是自动的.参考计数算法无法检测保留周期.循环检测需要更复杂的东西,并且会在运行时产生更多的开销. (3认同)
  • 它也是iOS5中的运行时功能.除了将弱指针置零之外,iOS 4支持ARC http://stackoverflow.com/questions/7246513/zeroing-weak-references-in-arc (2认同)

Jan*_*ano 9

自动引用计数实现了Objective-C对象和块的自动内存管理,使程序员免于明确插入保留和释放的需要.

你会担心更少的内存管理.有关于该主题的公共信息:

如果规范太难以阅读,简而言之,您需要编辑保留/释放代码以使用ARC,但旧程序保持兼容.你不应该做的是混合两者.