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 方法调用顺序

iOS +load方法与 +initialize 方法调用顺序

iOS Load方法 和 initialize方法的比较

iOS中 性能优化之浅谈load与initialize

iOS之深入解析类方法+load与+initialize的底层原理