美文网首页
+load 与 +initialize

+load 与 +initialize

作者: Bonew01 | 来源:发表于2022-07-17 13:33 被阅读0次

    14:+load方法调用原理

    load方法是在runtime加载类,分类的时候调用,每个类,分类的load方法,在程序运行过程中只会加载一次,和其他方法调用不同,不是通过消息机制(isa一层层查找),而是在类,分类加载是直接通过函数地址调用,通过指针指向类,分类load方法地址,然后直接调用。

    总结:(可以看出确实是优先调用类的load方法,然后调用分类的load方法,分类的load方法不会覆盖类的load方法)

    a:一定是优先调用类的load方法,然后调用分类的load方法,这个和编译顺序无关

    b:类与类之间的load方法调用顺序和编译顺序有关

    c:调用子类的load方法之前,会保证其父类的load方法已调用,即父类的load方法优先调用,即使父类编译顺序在子类后面(不会被覆盖)

    d:分类的load方法调用顺序与编译顺序有关,先编译先调用

    14.1: +load方法会在runtime加载类、分类时调用

    每个类、分类的+load,在程序运行过程中只调用一次

    调用顺序

    先调用类的+load

    按照编译先后顺序调用(先编译,先调用)

    调用子类的+load之前会先调用父类的+load

    再调用分类的+load

    按照编译先后顺序调用(先编译,先调用)

    15;+initialize方法调用原理

    initialize方法会在类第一次接收到消息时调用,并且它的调用顺序优先调用父类的initialize,再调用子类的initialize,前提是父类的initialize没有调用过。

    16:+load、+initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?

    区别:

    调用方式:load是根据函数地址直接调用,initialize是通过objc_msgSend调用

    调用时刻:load是runtime 加载类,分类的时候调用(只会调用一次),initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被被多次调用);

    load方法:先编译哪个类,就先调用哪个类的load,在调用load之前会先调用父类的load方法;分类中load方法不会覆盖本类的load方法,先编译的分类优先调用load方法;

    initialize方法:先初始化父类,之后再初始化子类,如果子类没有实现+initialize,会先调用父类的+initialize(所以父类的+initialize可能会被多次调用),如果分类实现了+initialize,就会覆盖类本身的+initialize调用;

    17:Category能否添加成员变量?如果可以,如何给Category添加成员变量?

    不能直接给category添加成员变量,但是可以间接实现category有成员变量的效果。

    我们可以使用runtime的API,关联对象

    objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)

    objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)

    相关文章

      网友评论

          本文标题:+load 与 +initialize

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