+load 与 +initialize的区别

先附上代码,load 方法的代码 我就不附上,大家可以自己动手测试一下。

@interface XZPerson : NSObject

@end
#import "XZPerson.h"

@implementation XZPerson

+ (void)initialize{
     NSLog(@"XZPerson-initialize");  
}

@end
//
#import "XZPerson.h"

@interface XZPerson (Eat)

@end
#import "XZPerson+Eat.h"

@implementation XZPerson (Eat)

+ (void)initialize{
    NSLog(@"XZPerson(Eat)-initialize");
}
@end
//
#import "XZPerson.h"

@interface XZPerson (Drink)
@end
@implementation XZPerson (Drink)

+ (void)initialize{
    NSLog(@"XZPerson(Eat)-initialize");
}
@end
//

#import "XZPerson.h"

@interface XZStudent : XZPerson

@end
#import "XZStudent.h"

@implementation XZStudent

+ (void)initialize{
    NSLog(@"XZStudent-initialize");
}

@end
//
#import "XZStudent.h"

@interface XZStudent (Test1)

@end
#import "XZStudent+Test1.h"

@implementation XZStudent (Test1)
+ (void)initialize{
    NSLog(@"XZStudent(Test1)-initialize");
}
@end
//
#import "XZStudent.h"

@interface XZStudent (Test2)

@end
#import "XZStudent+Test2.h"

@implementation XZStudent (Test1)
+ (void)initialize{
    NSLog(@"XZStudent(Test2)-initialize");
}
@end

结论如下:

一,+load 方法 会在runtime 加载类/分类时调用 在程序运行过程中只会调用一次。

  1. 先调用类的+ load ,按照编译顺序来,先编译先调用
  2. 在调用子类的+load 方法之前,会先调用父类的。
  3. 假如类有分类,会优先调用分类的+load
  4. + load的方法是根据方法地址直接调用,并不是经过objc_msgSend 函数调用的。
  5. 可以参考runtime的源码,objc-os.mm 中的_objc_init 方法中查看load_images等等

二,+initialize方法会在类第一次接收消息食调用

  1. 先调用父类的+initialize方法,在调用子类的,只会初始化一次
  2. 如果子类没有实现+initialize方法会优先调用父类的initialize方法,所以父类的initialize方法会被调用多次
  3. 如果分类调用了+initialize方法,那么它会覆盖本身的initialize方法
  4. 按照编译顺序,后编译的分类有先调用。
  5. +initialize是通过objc_msgSend调用的。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值