代码举例
#import "Person.h"
@implementation Person
+(void)load {
NSLog(@"person load 方法");
}
+ (void)initialize {
NSLog(@"person initialize方法");
}
@end
#import "Person+test.h"
@implementation Person (test)
+ (void)load {
NSLog(@"person test load 方法");
}
+ (void)initialize {
NSLog(@"person test initialize方法");
}
@end
#import "Man.h"
@implementation Man
+ (void)load {
NSLog(@"man load 方法");
}
+ (void)initialize {
NSLog(@"man initialize方法");
}
@end
1.先调用类的 load 方法,先编译哪个类就先调用该类的 load.
2.在调用 load 之前调用父类 load 方法.
3.分类 load 方法不会覆盖本类的 load 方法.
4.initialize 方法先初始化父类,之后再初始化子类.
5.如果子类未实现 initialize 方法,就会调用父类的 initialize 方法.
6.如果分类实现了 initialize 方法,会覆盖本类 initialize 方法.
上述代码正常运行打印结果:
2018-10-30 20:36:57.442455+0800 OC[56950:969972] person load 方法
2018-10-30 20:36:57.442674+0800 OC[56950:969972] man load 方法
2018-10-30 20:36:57.442692+0800 OC[56950:969972] person test load 方法
2018-10-30 20:36:57.442824+0800 OC[56950:969972] person test initialize方法
2018-10-30 20:36:57.442848+0800 OC[56950:969972] man initialize方法
同时也验证了2,3
注释掉 Person 分类中的 initialize 方法
#import "Person+test.h"
@implementation Person (test)
+ (void)load {
NSLog(@"person test load 方法");
}
//+ (void)initialize {
// NSLog(@"person test initialize方法");
//}
@end
打印结果:
2018-10-30 20:49:03.209223+0800 OC[57067:976365] person load 方法
2018-10-30 20:49:03.209410+0800 OC[57067:976365] man load 方法
2018-10-30 20:49:03.209429+0800 OC[57067:976365] person test load 方法
2018-10-30 20:49:03.209488+0800 OC[57067:976365] person initialize方法
2018-10-30 20:49:03.209507+0800 OC[57067:976365] man initialize方法
注释掉子类的 initialize 方法
#import "Man.h"
@implementation Man
+ (void)load {
NSLog(@"man load 方法");
}
//+ (void)initialize {
// NSLog(@"man initialize方法");
//}
@end
打印结果:
2018-10-30 20:51:22.247322+0800 OC[57095:977738] person load 方法
2018-10-30 20:51:22.247501+0800 OC[57095:977738] man load 方法
2018-10-30 20:51:22.247518+0800 OC[57095:977738] person test load 方法
2018-10-30 20:51:22.247592+0800 OC[57095:977738] person initialize方法
2018-10-30 20:51:22.247617+0800 OC[57095:977738] person initialize方法
恢复 Person 分类注释的代码,打印结果:
2018-10-30 20:52:30.880179+0800 OC[57137:978579] person load 方法
2018-10-30 20:52:30.880345+0800 OC[57137:978579] man load 方法
2018-10-30 20:52:30.880362+0800 OC[57137:978579] person test load 方法
2018-10-30 20:52:30.880418+0800 OC[57137:978579] person test initialize方法
2018-10-30 20:52:30.880437+0800 OC[57137:978579] person test initialize方法
至此,以上六条都得以验证.