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)