为何自定义声明_objc_rootIsDeallocating后会调用系统方法?
为什么声明
_objc_rootIsDeallocating后仍调用系统方法? 你在代码中仅声明了_objc_rootIsDeallocating函数,但运行时实际调用系统实现的原因如下:
链接器的符号解析逻辑:
_objc_rootIsDeallocating是Objective-C运行时(libobjc.A.dylib)的私有核心函数,系统库中已经存在该函数的实现并导出了符号。你只添加了函数声明,没有提供自定义实现,链接器在寻找符号时会自动绑定到系统库中已有的实现上。系统库的加载优先级:程序启动时,系统框架会被优先加载,其包含的函数符号会被注册到全局符号表。当你的代码调用该函数时,动态链接器会直接匹配全局符号表中的系统版本,而非你仅声明的未实现符号。
自定义实现的必要性:如果想让代码调用自己的版本,必须提供完整的函数实现,并且通过符号覆盖技术(比如fishhook、静态链接优先级调整等)让链接器优先选择你的实现。仅声明不实现的情况下,链接器会默认使用系统已有的符号绑定。
你的代码示例:
#import "ViewController.h" bool _objc_rootIsDeallocating(id _Nonnull obj); @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; bool isDeallocating = _objc_rootIsDeallocating(self); NSLog(@"test is deallocating: %d", isDeallocating); } @end
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

