objective-c - Objective C 在 RUNTIME 级别自动释放
问题描述
这不是该链接中线程的副本,因为我的问题与 RUNTIME 调用有关,而不是与 autoreleasepool{} 块的工作方式或为什么需要它有关。我在问当您使用 autoreleasepool{} 块时发生的 RUNTIME 函数的调用堆栈是什么。在引入链接的线程中没有描述
最近被问到一个问题
“解释自动释放池如何在运行时级别工作?”
我知道在 ARC 中,保留和释放调用是由 ObjC 运行时库编译时插入的。但是,我无法找到任何合适的 ObjC 运行时函数来执行该调用。所以我的问题是:
Q1:当你使用自动释放池时,运行时会发生什么?
Q2:调用了哪些函数?
Q3:保留/释放的 ObjC 运行时函数是什么?
解决方案
自动释放池只是一个记录未来版本的数据结构。如果没有 ARC,当您发送-autorelease
到一个对象时,会在自动释放池中创建一个注释。当[pool drain]
最终调用时(或等效地,当池被释放时),它将-release
为每个请求的每个对象发送一个-autorelease
。
如果没有自动释放,MRC 会很不方便。从方法调用返回的每个对象都必须显式释放。(被调用的方法不能释放它,否则它会在调用方法访问它之前被销毁。)
ARC 的自动释放实现要复杂得多。Autorelease 引入了各种性能影响。一个问题是调用者通常会保留一个自动释放的对象。这意味着在 MRC 中经常有一个“保留/自动释放/保留/延迟释放”的舞蹈,这是不必要的,可以用“保留”来代替。编译器有时可以检测到这些,但有时直到运行时才能检测到。所以有一些特殊的 ARC 方法,比如在运行时检查堆栈objc_retainAutoreleasedReturnValue
并objc_autoreleaseReturnValue
尽量避免不必要的自动释放。
Clang 的 ARC 文档中提供了详细信息。请参阅“运行时支持”部分。
至于保留/释放,这些是由objc_retain
和实现的objc_release
。
推荐阅读
- amazon-web-services - Terraform 中的数据源
- javascript - 如果字段返回 TypeError,则忽略 JSON 解析错误
- javascript - 当 ob1.prototype 未定义时,Object.create() 应该如何从 ob1.prototype 创建 obj2.__proto__?
- python - Pandas - 根据与数据框中某些值匹配的系列索引将值从系列添加到数据框列
- javascript - 如何制作一个让我退出网站的脚本?
- javascript - 停止从 JavaScript 中的另一个函数运行的函数
- java - java - 如何使用java套接字通过两个不同的wifi连接两台电脑?
- java - java.lang.NoSuchFieldError:默认
- swift - 如何与 Firestore 数据同步更新 UILabel?
- python - 根据最小订单选择独特的产品