Objective-C:为什么自动释放池存在并按照它们的方式工作?

时间:2013-04-10 11:25:28

标签: objective-c memory-management

我研究了一个关于Objective-C内存管理的教程,我想我明白它是如何工作的。但是,我想知道为什么自动释放池的创建方式与它们的工作方式相同。据我所知,自动释放消息主要用于从函数返回对象时,因为被调用者无法确定调用者是否会将结果实际存储在变量中(以后必须释放返回的对象)。我有一个理论认为,这个概念是在Objective-C仅仅是预处理器的那一天制作的。编译器会知道未指定的返回值,并且可以静默地自动插入返回对象的版本(这种行为意味着必须手动释放每个指定的返回值)

所以我的问题:

  • 我的理论是正确的还是自动释放池概念还有其他原因
  • 是否存在其他概念来处理基于保留/发布的手动内存管理(不一定是Objective-C)的返回值问题

1 个答案:

答案 0 :(得分:7)

您的解释部分正确。是的,自动释放池主要用于从函数或方法返回非拥有对象:您无法在方法中释放对象,或者调用者无法使用它。您可能要求调用者接受从函数或方法返回的对象的所有权,因为Core Foundation使用其Create规则,但Foundation引入了自动释放池并避免了此要求。

然而,这与 相关,而Objective-C是预处理器或编译器的一部分。它完全依赖于框架和语言使用的内存管理策略。

  • 早期(预处理​​)Objective-C有一个"程序员最了解"政策,类似于C&#39 malloc / free系统。它没有自动释放池;程序员在知道对象完成后释放对象。
  • 基金会介绍[*]引用计数内存管理,并使用自动释放池实现延迟发布。这是一个"对象的程序员最了解"政策,每个对象可以说它拥有什么,但不需要整体内存管理编码。
  • 垃圾收集的Objective-C至少存在两个(possibly three)个版本。即使在垃圾收集的基金会中也有自动释放池,但是运行时运行时最了解"策略,因此您可以在没有自动释放池的情况下离开,因为运行时可以看到对象何时仍在使用中。
  • 自动引用计数,顾名思义,自动化Foundation的引用计数内存管理方案。在 theory 中,您不需要自动释放池,因为编译器和运行时可以告诉对象如何被使用并修复所有权。实际上,您仍然可以这样做,因为您可以与手动引用计数代码进行互操作。 ARC仍然是"对象的程序员最了解",但它会删除手动保留和释放,而不是手动强/弱/不安全的引用标记。

您的建议是,只有当对象别名为编译器可见的命名变量时才应保留该对象在一般情况下不起作用。程序员可以保留对该对象的未命名引用(例如,在集合中或通过关联),或者他们可以创建一个必须保持不变的对象,尽管它有 no 别名。

[*]事实上,引用计数系统早先存在于Mach Kit as NXReference中(并且在其他框架中使用,如Indexing Kit),但当它成为Foundation的一部分时,它成为所有Objective-C类的常规系统(在NeXTStep和WO应用程序中,因此在Mac和iOS应用程序中)使用引用计数的内存管理。