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 中 retain 和 release 调用是在 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_retainAutoreleasedReturnValue
和 objc_autoreleaseReturnValue
,它们在运行时检查堆栈并尽量避免不必要的自动释放。
ARC documentation for Clang 中提供了详细信息。请参阅 "Runtime support" 部分。
至于retain/release,这些是由objc_retain
和objc_release
实现的。
这不是 link 中线程的副本,因为我的问题与 RUNTIME 调用有关,而不是 autoreleasepool{} 块的工作方式或为什么需要它。我问的是当您使用 autoreleasepool{} 块时发生的 RUNTIME 函数的调用堆栈是什么。在 link 带来的线程中没有描述
最近有人问我一个问题
"Explain how an autorelease pool works at the runtime level?"
我知道在 ARC 中 retain 和 release 调用是在 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_retainAutoreleasedReturnValue
和 objc_autoreleaseReturnValue
,它们在运行时检查堆栈并尽量避免不必要的自动释放。
ARC documentation for Clang 中提供了详细信息。请参阅 "Runtime support" 部分。
至于retain/release,这些是由objc_retain
和objc_release
实现的。