美文网首页
+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