iOS +load方法与 +initialize 方法调用顺序
Posted ZCLegendary
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS +load方法与 +initialize 方法调用顺序相关的知识,希望对你有一定的参考价值。
代码举例
父类
#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方法
至此,以上六条都得以验证.
以上是关于iOS +load方法与 +initialize 方法调用顺序的主要内容,如果未能解决你的问题,请参考以下文章
IOS杂笔- 7(类方法load与initialize的区别 浅析)
iOS +load方法与 +initialize 方法调用顺序