CaptainHook浅析

作者: 玩呀玩 | 来源:发表于2018-05-30 14:51 被阅读38次

    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浅析

        本文链接:https://www.haomeiwen.com/subject/swgtsftx.html