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方法的异同的主要内容,如果未能解决你的问题,请参考以下文章

细说OC中的load和initialize方法

OC底层Category+load方法+initialize方法原理

iOS开发-OC篇-单例模式

load和initialize方法

iOS开发-类的加载load函数和initialize函数

iOS Load方法 和 initialize方法的比较