美文网首页
+load和+initialize

+load和+initialize

作者: MAXcrazs | 来源:发表于2021-04-14 21:58 被阅读0次

    +load和+initialize都是系统自行调用的,不需要手动调用。子类重写方法也不需要调用[super func];

    + load

    • +load方法调用发生在main函数执行之前
    • 同一个【类】的+load执行顺序是【主类】--> 【分类】
      • 多个不同【分类】中的+load都会被执行,执行顺序取决与【Build Phases】-->【Complete Souces】的顺序,谁在前面谁先执行
    • 具有继承关系的【类】,先调用【父类主类】的+load,再调用【自己主类】的load
      • 【父类分类】和【子类分类】的+load调用顺序取决于【Build Phases】-->【Complete Souces】的顺序,谁在前面谁先执行
    • 无继承关系的两个【类】,+load调用顺序取决于【Build Phases】-->【Complete Souces】的顺序,谁在前面谁先执行
    • 如果不手动调用,+load只会执行一次
    • 如论是否创建了实例对象或者调用类方法,+load都会被回调

    代码1

    1.png
    @interface SimpleA : NSObject
    @interface SimpleB : SimpleA
    @interface SimpleC : SimpleA
      
    SimpleB *o1 = [[SimpleB alloc] init];
    SimpleC *o2 = [[SimpleC alloc] init];
    

    结果

     A load
     0x1000087e8:C load
     0x100008838:B load
     A1 load
     B2 load
     B1 load
     A2 load
     main function
     Hello, World!
    

    代码2

    @interface SimpleA : NSObject
    @interface SimpleB : SimpleA
    @interface SimpleC : SimpleA
      
    SimpleB *o1 = [[SimpleB alloc] init];
    [SimpleB load];
    

    结果

     A load
     0x100008808:C load
     0x100008858:B load
     A1 load
     B2 load
     B1 load
     A2 load
     main function
     Hello, World!
     B1 load
    

    + initialize

    • + initialize调用发生在main函数执行之后

    • 如果存在【分类】,执行分类中的+initialize方法

      • 多个【分类】存在+initialize只会执行一个,执行哪个取决与【Build Phases】-->【Complete Souces】的顺序,谁在后面执行谁
    • 具有继承关系的【类】,先调用【父类】的+initialize再调用【子类】的+initialize

    • 【父类】的+initialize可能会被执行多次

    • 只有【类】被使用,即调用类方法或者创建实例对象时,+initialize才会被调用

    • 如果B,C两个类同时继承A并都有+initialize方法,A的+initialize只会被调用一次

      • 如果C没有+initialize方法,会调用父类A的+initialize方法

    代码3

    @implementation SimpleB (B1)
    + (void)initialize{
        NSLog(@"B1 initialize");
    }
    @end
    @implementation SimpleC
    @end
      
    SimpleB *o1 = [[SimpleB alloc] init];
    SimpleC *o2 = [[SimpleC alloc] init];
    

    结果

     main function
     Hello, World!
     A2 initialize
     B1 initialize
     A2 initialize
    

    代码4

    @implementation SimpleB (B1)
    + (void)initialize{
        NSLog(@"B1 initialize");
    }
    @end
    @implementation SimpleC
    + (void)initialize{
        NSLog(@"%p:C initialize", self);
    }
    @end
      
    SimpleB *o1 = [[SimpleB alloc] init];
    SimpleC *o2 = [[SimpleC alloc] init];
    

    结果

     main function
     Hello, World!
     A2 initialize
     B1 initialize
     0x100008810:C initialize
    

    手动调用

    • 手动调用+load,会使用objc_msgSend来调用+load方法,会调用【分类】中的load方法,【多个分类】调用顺序取决于【Build Phases】-->【Complete Souces】的顺序,谁在后面执行谁

    相关文章

      网友评论

          本文标题:+load和+initialize

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