美文网首页ios开发
+load方法 与+initialize方法的比较

+load方法 与+initialize方法的比较

作者: 微_涼 | 来源:发表于2018-11-13 10:45 被阅读9次

runtime调用load方的的底层实现

image.png
有代码可知,在程序运行中,会先调用类的load方法,再调用分类的load方法
调用load的具体方法如下
image.png
由截图可知:load方法是取出后,直接进行调用的,并不是通过消息转发机制massage_send进行调用的,而且当调用子类的load方法时,会先调用父类的load方法,再调用子类的load方法。
总结
  • +load方法会在runtime加载类,分类的时候进行调用。
  • 每个类,分类的+load方法在程序的运行过程中只会调用一次;

1,先调用类的+load方法
1.1按照编译先后顺序进行调用(先编译,先调用);
1.2调用子类的load方法之前会先调用父类的load方法;
2,再调用分类的+load( 按照编译的先后顺序进行调用);

+initialize方法会在类第一次接收到消息的时候进行调用,调用顺序为:
先调用父类的+initialize,再调用子类的+initialize(先初始化父类,再初始化子类,而且每个类只会初始化一次)

+initialize和+load的区别:

1.调用方式不同:

  • initialize是通过消息转发机制massage_send进行调用的,所以有如下t特点:如果子类没有实现+initialize方法,会调用父类的+initialize方法(所以父类的+initialize方法),如果分类实现了+initialize方法,会覆盖类本身的+initialize方法;
    +load方法是先查找到函数地址后直接进行调用的;
    2.调用时刻不同:
    • load是runtime加载类/分类的时候进行调用(只会调用一次);
    • initialize是类第一次接收到消息的时候进行调用,每一个类只会initialize一次(父类的可能会被调用多次)。
      3,调用顺序:
  • load方法是先调用类的load,在调用分类的load(先编译的类优先调用,调用子类的load方法之前,会先调用父类的load);
    -initialize是先初始化父类,再初始化子类(子类没有实现方法时,会调用父类的initialize)。

相关文章

网友评论

    本文标题:+load方法 与+initialize方法的比较

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