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
执行时机只要引用了类文件,在程序运行后立即执行在类的方法第一次被调时执行
若自身未定义,是否沿用父类的方法?
类别中的定义全都执行,但后于类中的方法覆盖类中的方法,只执行一个
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值