代码举例
父类
#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
首先列出 load,initialize 方法的调用顺序,然后验证.
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方法
至此,以上六条都得以验证.