Objective C 在运行时自动释放

Objective C autorelease at RUNTIME level

这不是 link 中线程的副本,因为我的问题与 RUNTIME 调用有关,而不是 autoreleasepool{} 块的工作方式或为什么需要它。我问的是当您使用 autoreleasepool{} 块时发生的 RUNTIME 函数的调用堆栈是什么。在 link 带来的线程中没有描述

最近有人问我一个问题

"Explain how an autorelease pool works at the runtime level?"

我知道在 ARC 中 retainrelease 调用是在 ObjC 运行时库编译时插入的。但是,我无法找到任何合适的 ObjC 运行时函数来执行该调用。 所以我的问题是:

Q1:使用自动释放池时在运行时会发生什么?

Q2:调用了哪些函数?

问题 3:retain/release 的 ObjC 运行时函数是什么?

自动释放池只是一种记录未来释放的数据结构。如果没有 ARC,当您将 -autorelease 发送到一个对象时,会在自动释放池中生成一个注释。当 [pool drain] 最终被调用时(或者等效地,当池被释放时),它将为每个被请求的 -autorelease 发送一个 -release 到每个对象。

没有autorelease,MRC会很不方便。从方法调用返回的每个对象都必须显式释放。 (被调用的方法不能释放它,否则它会在调用方法访问它之前被销毁。)

ARC 的自动释放实现要复杂得多。 Autorelease 引入了各种性能影响。一个问题是自动释放的对象通常由调用者保留。这意味着在 MRC 中经常有一个 "retain/autorelease/retain/defferred-release" 舞蹈是不必要的,可以用 "retain." 代替。编译器有时可以检测到这些,但有时直到运行时才能检测到。所以有特殊的 ARC 方法,如 objc_retainAutoreleasedReturnValueobjc_autoreleaseReturnValue,它们在运行时检查堆栈并尽量避免不必要的自动释放。

ARC documentation for Clang 中提供了详细信息。请参阅 "Runtime support" 部分。

至于retain/release,这些是由objc_retainobjc_release实现的。