iOS 5是否有垃圾回收?

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

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

首先,它主要是编译器技术。 编译器知道Cocoa的引用计数准则,所以它根据规则插入保留和释放。 它的工作原理就像是你自己编写了保留和释放 – 它只是为你插入。 正常的垃圾收集器在运行时跟踪程序的内存。

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

它也使用不同于自动垃圾收集器的资源。 与Objective-C一起使用的垃圾收集器必须扫描未被引用的内存并收集它 – 这是昂贵的,并且可能导致在较慢的系统上“口吃” – 但是它们偶尔只需要这样做,理论上甚至可以微调他们的收集周期,以配合一个程序如何实际使用它的记忆。 一般来说,GC程序将比非GC程序使用更多的内存,当GC决定收集时会显着减慢。 另一方面,ARC会将“扫描”移动到编译时间并尽快释放内存,但它必须不断更新对象引用计数,而不是像收集器一样等待垃圾build立。

在苹果的公共iOS 5页面上 ,他们表示:

自动引用计数

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

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

自动引用计数实现了对Objective-C对象和块的自动内存pipe理,使程序员不必显式插入保留和释放。

你会less担心内存pipe理。 有关于这个问题的公共信息:

  • ARC取代GC? (lists.apple.com)
  • 自动引用计数 (clang.llvm.org)。 这是ARC的技术规格。

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