首页 > 解决方案 > Objective C 在 RUNTIME 级别自动释放

问题描述

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

最近被问到一个问题

“解释自动释放池如何在运行时级别工作?”

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

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

Q2:调用了哪些函数?

Q3:保留/释放的 ObjC 运行时函数是什么?

标签: objective-cmemory-managementruntimeautorelease

解决方案


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

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

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

Clang 的 ARC 文档中提供了详细信息。请参阅“运行时支持”部分。

至于保留/释放,这些是由objc_retain和实现的objc_release


推荐阅读