21

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

4

3 回答 3

39

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

首先,它主要是一种编译器技术。编译器知道 Cocoa 的引用计数准则,因此它根据规则将保留和释放插入到它们应该在的位置。它的工作方式就像您自己编写保留和释放一样——它只是为您插入它们。正常的垃圾收集器会在程序运行时跟踪程序的内存。

其次,由于它就像retain和release一样,它不能捕获retain循环(如果对象A保留了对象B,对象B保留了对象A,并且没有其他任何引用它们,它们都成为不朽的)。您需要采取相同的预防措施来防止它们。

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

于 2011-07-05T01:48:58.570 回答
23

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

自动引用计数

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

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

于 2011-07-04T22:59:00.373 回答
9

自动引用计数实现了 Objective-C 对象和块的自动内存管理,将程序员从显式插入保留和释放的需要中解放出来。

您将更少担心内存管理。有关于该主题的公开信息:

简而言之,如果规范过于苛刻,您将需要编辑保留/释放代码以使用 ARC,但旧程序仍然兼容。你不应该做的是混合两者。

于 2011-07-04T23:17:36.747 回答