OC中load方法和initialize方法的异同
Posted 乌戈勒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC中load方法和initialize方法的异同相关的知识,希望对你有一定的参考价值。
一、执行时机
它们的特别之处:
在于程序运行一开始就被调用了,即在类使用之前,就自动调用了这两个方法。
1、load方法:如果类自身没有定义,并不会调用其父类的load方法;
2、initialize方法:如果类自身没有定义,就会调用其父类的initialize方法;
二、区别
执行的前提条件:
1、load 只要类所在文件被引用,就会执行;
2、如果类没有引用进项目,就不会有load的执行;
3、initialize 需要类或者其子类的第一个方法被调用,才会执行,而且是在第一个方法执行之前,先执行;
4、即使类文件被引用进项目,但是没有使用,那么initialize就不会调用执行;
- 说明:
runtime对+(void)load的调用并不视为类的第一个方法;
三、共同点
方法只会执行一次
四、执行顺序
对于load方法的执行顺序优先级:
1、父类中方法 > 子类中方法;
2、类中方法 > 类别中方法;
- 结论:
如果load方法和initialize方法都有执行,那么,initialize方法优先于load方法先执行。
五、例子
//代码说明:+(void)load会引发+(void)initialize,load方法做调用了[self class]方法,会触发initialize方法的执行
/******* Interface *******/
@interface SuperClass : NSObject
@end
@interface ChildClass : SuperClass
@end
@interface Insideinitialize : NSObject
- (void)objectMethod;
@end
/******* Implementation *******/
@implementation SuperClass
+ (void) initialize
NSLog(@"%@ %s", [self class], __FUNCTION__);
+ (void) load
NSLog(@"%@ %s", [self class], __FUNCTION__);
@end
@implementation ChildClass
+ (void) initialize
NSLog(@"%@ %s", [self class], __FUNCTION__);
Insideinitialize * obj = [[Insideinitialize alloc] init];
[obj objectMethod];
[obj release];
@end
@implementation Insideinitialize
- (void)objectMethod
NSLog(@"%@ %s", [self class], __FUNCTION__);
+ (void) initialize
NSLog(@"%@ %s", [self class], __FUNCTION__);
+ (void) load
NSLog(@"%s", __FUNCTION__);
@end
- 代码输出结果:
SuperClass +[SuperClass initialize]
SuperClass +[SuperClass load]
Insideinitialize +[Insideinitialize load]
//代码说明:子类会调用父类的+(void)initialize
/******* Interface *******/
@interface SuperClass : NSObject
@end
@interface ChildClass : SuperClass
@end
@interface Insideinitialize : NSObject
- (void)objectMethod;
@end
/******* Implementation *******/
@implementation SuperClass
+ (void) initialize
NSLog(@"%@ %s", [self class], __FUNCTION__);
@end
@implementation ChildClass
+ (void) load
NSLog(@"%@ %s", [self class], __FUNCTION__);
@end
- 代码输出结果:
SuperClass +[SuperClass initialize]
ChildClass +[SuperClass initialize]
ChildClass +[ChildClass load]
六、总结:
区别 | +(void)load | +(void)initialize |
---|---|---|
执行时机 | 只要引用了类文件,在程序运行后立即执行 | 在类的方法第一次被调时执行 |
若自身未定义,是否沿用父类的方法? | 否 | 是 |
类别中的定义 | 全都执行,但后于类中的方法 | 覆盖类中的方法,只执行一个 |
以上是关于OC中load方法和initialize方法的异同的主要内容,如果未能解决你的问题,请参考以下文章