iOS 一张图看懂 initialize 和 load 的区别
2018-11-03 本文已影响11人
iOS坚持者
通过测试,load 会在程序启动 main 函数调用之前就会被执行,
而initialize只有在第一次创建这个类的时候才会被执行
源码如下:
CCCC 继承于 AAAA
AAAA.m
@interface AAAAA: NSObject
@end
@implementation AAAAA
-(void)dealloc{
NSLog(@"%@对象执行 dealloc 方法",NSStringFromClass(self.class));
}
+(void)load
{
NSLog(@"%s---",__func__);
}
+(void)initialize{
[super initialize];
NSLog(@"%s---%@",__func__,NSStringFromClass(self.class));
}
@end
CCCC.m
@implementation CCCCC
- (void)dealloc
{
NSLog(@"%@对象执行 dealloc 方法",NSStringFromClass(self.class));
}
//+(void)load
//{
//
// NSLog(@"%s---",__func__);
//}
//
//+(void)initialize{
// [super initialize];
// NSLog(@"%s---",__func__);
//}
@end
打印结果
有上图可以得出一下结论:
1、load 方法默认不会执行[super load]:
通过注释 CCC 类的load方法,在程序启动的时候 AAAA 的load方法只执行了一次;而去掉注释 CCC 的 load 方法依然会执行,这就说明在程序加载CCCC 类执行到 load 函数的时候并没有去调用父类的 load 方法。注意不要再 load 中调用self,程序会去执行initialize方法。
2、initialize 方法默认会[super initialize]:
同理操作即可得出initialize会执行父类方法。
3、initialize 方法只会被相同的类对象执行一次:
有上图可得,在第一次创建 AAAA 对象的时候,initialize执行了一次,AAAA 对象 dealloc 了再去点击屏幕 new 一个新的对象,initialize不会去执行,说明initialize 方法只会被相同的类对象执行一次。
CCCC 类去执行父类的initialize方法,当前的类对象依然是 子类CCCC 而不是 父类AAAA。
load方法通常用来进行Method Swizzle,initialize方法一般用于初始化全局变量或静态变量。
load和initialize方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。