你的解释是部分正确的。是的,自动释放池主要用于从函数或方法返回非拥有对象:您不能在方法内释放对象,或者调用者不能使用它。您可以要求调用者接受从函数或方法返回的对象的所有权,就像 Core Foundation 对其 Create 规则所做的那样,但 Foundation 引入了自动释放池并避免了此要求。
然而,这与Objective-C 作为预处理器或编译器的一部分无关。它完全依赖于框架和语言使用的内存管理策略。
- 早期的(预处理的)Objective-C 有一个“程序员最了解”的政策,类似于 C 的
malloc
/free
系统。它没有自动释放池;程序员在知道对象完成时释放它。
- Foundation 引入了[*] 引用计数内存管理,并使用自动释放池来实现延迟释放。这是一个“对象的程序员最了解”策略,每个对象都可以说出它拥有什么,但不需要整体的内存管理编码。
- 垃圾收集的 Objective-C 至少存在两个(可能三个)化身。即使在 Garbage-collected Foundation 中也有自动释放池,但有一个“运行时最清楚”策略,因此您可以在没有自动释放池的情况下逃脱,因为运行时可以看到对象何时仍在使用中。
- 顾名思义,自动引用计数使 Foundation 的引用计数内存管理方案自动化。从理论上讲,您不需要自动释放池,因为编译器和运行时可以判断对象如何使用并修复所有权。实际上,您仍然可以这样做,因为您可以与手动引用计数的代码进行互操作。ARC 仍然是“对象的程序员最了解”,但它放弃了手动保留和释放,转而支持手动强/弱/不安全引用标记。
您建议仅在将对象别名为编译器可见的命名变量时才应保留对象的建议在一般情况下不起作用。程序员可以保留对该对象的未命名引用(例如,在集合中或通过关联),或者他们可以创建一个必须保留的对象,尽管它没有别名。
[*] 事实上,引用计数系统作为 NXReference 存在于 Mach Kit 中(并在其他框架中使用,如 Indexing Kit),但当它成为 Foundation 的一部分时,它成为所有 Objective-C 类的常规(在 NeXTStep 和WO 应用程序,因此在 Mac 和 iOS 应用程序中)使用引用计数内存管理。