CaptainHook浅析

constructor / destructor

Objective-C最后还是转译成C语言,当然还有constructor / destructor
加上这两个属性的函数会在分别在可执行文件(或 shared library)load 和 unload 时被调用,可以理解为在 main() 函数调用前和 return 后执行

实际上constructor会在+load之后执行
因为 dyld(动态链接器)最开始会先通知 objc runtime 去加载其中所有的类,每加载一个类时,它的 +load 随之调用,全部加载完成后,dyld 才会调用所有的 constructor 方法

CaptainHook 也是利用这一原理来实现的,这样做有几个优点:

  • 所有 Class 都已经加载完成
  • main 函数还未执行
  • 不用和+load 一样 写在一个 Class 里面
__attribute__((constructor))
static void beforeMain(void) {
    NSLog(@"beforeMain");
}
__attribute__((destructor))
static void afterMain(void) {
    NSLog(@"afterMain");
}
int main(int argc, const char * argv[]) {
    NSLog(@"main");
    return 0;
}

若有多个 constructor 且想控制优先级的话,可以写成 attribute((constructor(101))),里面的数字越小优先级越高,1 ~ 100 为系统保留。

有什么不正确的地方请留言 大家共同进步

你可能感兴趣的:(CaptainHook浅析)