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方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。

上一篇下一篇

猜你喜欢

热点阅读