Prepare
- Load 方法当类被加载到 runtime 的时候就会运行,而且有依据如下两个条件:
A: 根据Compile Sources 中的顺序来加载。
B: Category 会在一般类之后。
C: 有继承关系的会先加载父类。
//Father
@implementation Father
+ (void)load {
NSLog(@"=== father load");
}
+ (void)initialize {
NSLog(@"=== father initialize");
}
@end
//Son
@interface Son : Father
@end
@implementation Son
+ (void)load {
NSLog(@"=== Son load");
}
+ (void)initialize {
NSLog(@"=== Son initialize");
}
@end
//Father Category
@implementation Father (category)
+ (void)load {
NSLog(@"=== father category load");
}
+ (void)initialize {
NSLog(@"=== father category initialize");
}
@end
//Son category
@implementation Son (category)
+ (void)load {
NSLog(@"=== Son category load");
}
+ (void)initialize {
NSLog(@"=== Son category initialize");
}
@end
//Compile Source Order
Son.m
Father.m
Son+category.m
Father+category.m
//OutPut
=== father load
=== Son load
=== Son category load
=== father category load
- Initialize 发生在类第一次初始化时, 遵循以下规律(当然如果load方法里面调用例如 [self Class] 这样的方法,会先调用 initialize。
A: 有继承关系的如果子类没有实现Initialize ,会调用父类的,也就是说父类的Initialize 可能会被调用2次。
//Father
@implementation Father
+ (void)initialize {
NSLog(@"=== father initialize");
}
@end
//Son
@interface Son : Father
@end
@implementation Son
//+ (void)initialize {
// NSLog(@"=== Son initialize");
//}
@end
//AppDelegate.m
[Son new]
[Father new]
//OutPut
=== father initialize
=== father initialize
//Resolver
+ (void)initialize {
if (self == [Father class]){
NSLog(@"=== father initialize");
}
}
B: 如果 Category 也重写了Initialize, 会override, 也就是原来类里面的Initialize 不会被调用。
//最上面源码里面的输出
=== father category initialize
=== Son category initialize
适用场景
- load() 会增加启动时间,不适宜做过多的事情,一般用于简单的运行时方法交换。
- Initialize() 仅仅用来需要延迟加载一些全局或者静态变量。
网友评论