gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:38:27 25 4
gpt4 key购买 nike

我学习了有关 Objective-C 内存管理的教程,我想我了解它是如何工作的。但是,我想知道为什么要创建自动释放池来按照它们的方式工作。据我所知,自动释放消息主要用于从函数返回对象时,因为被调用者无法确定调用者是否会将结果实际存储在变量中(稍后释放返回的对象是必要的)。我有一个理论,这个概念是在 Objective-C 仅仅是一个预处理器的时候提出的。相反,编译器会知道未分配的返回值,并且可以静默地为返回的对象自动插入释放(此行为意味着每个分配的返回值都必须手动释放)

所以我的问题:

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

最佳答案

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

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

  • 早期(预处理​​的)Objective-C 有一个“程序员最了解”的政策,类似于 C 的 malloc/free 系统。它没有自动释放池;程序员在知道对象已完成时释放对象。
  • 基金会引入[*]引用计数内存管理,并使用自动释放池实现延迟释放。这是一个“对象的程序员最清楚”的策略,其中每个对象都可以说出它拥有什么,但不需要整体内存管理编码。
  • 垃圾收集的 Objective-C 至少存在两个 (possibly three) 版本。即使在 Garbage-collected Foundation 中也有自动释放池,但是有一个“运行时知道最好”的策略,所以你可以在没有自动释放池的情况下逃脱,因为运行时可以看到对象何时仍在使用中。
  • Automatic reference counting,顾名思义,自动执行 Foundation 的引用计数内存管理方案。在理论中,您不需要自动释放池,因为编译器和运行时可以告诉对象如何使用并确定所有权。实际上,您仍然会这样做,因为您可以与手动引用计数代码进行互操作。 ARC 仍然是“对象的程序员最了解的对象”,但它放弃了手动保留和释放,转而使用手动强/弱/不安全引用标记。

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

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

关于Objective-C:为什么自动释放池存在并以它们的方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com