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

本文详细解析了Objective-C中类加载(load)与初始化(initialize)方法的调用顺序及特性,通过具体代码示例验证了父类、子类及分类在加载与初始化过程中的执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码举例

父类

#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方法

 

至此,以上六条都得以验证.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值