浅谈OC类方法load和initialize系列五

2017-10-17  本文已影响0人  天蓬大元

除了满足条件被运行时提前自动调用之外,这两种方法也可以被当作普通类方法被调用。

@interface SuperClass : NSObject
@end
+(void)initialize{
    NSLog(@"%@ %s",[self class], __FUNCTION__);
}
+ (void) load {
    NSLog(@"%@ %s", [self class], __FUNCTION__);
}
@interface ChildClass : SuperClass
@end
@implementation ChildClass

+(void)initialize{
    NSLog(@"%@ %s",[self class], __FUNCTION__);
}
@end

在程序中让ChildClass直接调用load:
[ChildClass load];
运行程序,获得下面的结果:

SuperClass +[SuperClass initialize]
SuperClass +[SuperClass load]
ChildClass +[ChildClass initialize]
ChildClass +[SuperClass load]

手动调用load时。满足条件也会触发initialize。说明无论手动还是自动调用load,只要initialize满足触发条件,运行时都会自动调用该方法。
另外,ChildClass继承下来的load方法可以被安全的当作普通的类方法被调用。这也就是之前所说的load和initialize被调用一次是相对Runtime而言的(比如SuperClass的initialize不会因为自身load方法调用一次,有因为子类调用了load又执行一次),我们依然可以直接去反复调用这些方法。

资料链接:

[IDER]:
http://blog.iderzheng.com
http://blog.iderzheng.com/objective-c-load-vs-initialize/
[MrPeak杂货铺]:http://blog.csdn.net/hanangellove/article/details/45033453
[知乎上的一个怎么面试iOS工程师的问题]:
http://blog.csdn.net/hanangellove/article/details/45033453

上一篇 下一篇

猜你喜欢

热点阅读