+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方法
- 如果C没有
代码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】的顺序,谁在后面执行谁
网友评论