精简initialize 与 load的实现代码
作者:
三岁就很乖 | 来源:发表于
2017-06-19 15:50 被阅读28次load方法
+(void)load;
每个类和分类在加入运行期系统时,都会调用load方法,而且仅仅调用一次,尽量不要在这个方法里调用其他方法,尤其是使用其他的类。原因是每个类载入程序库的时机是不同的,如果该类调用了还未载入程序库的类,就会很危险。
initialize方法
+(void)initialize;
这个方法与load方法类似,区别是这个方法会在程序首次调用这个类的时候调用(惰性调用),而且只调用一次(绝对不能主动使用代码调用)。
值得注意的一点是,如果子类没有实现它,它的超类却实现了,那么就会运行超类的代码:这个情况往往很容易让人忽视。
看一下
#import <Foundation/Foundation.h>
@interface EOCBaseClass : NSObject
@end
@implementation EOCBaseClass
+ (void)initialize {
NSLog(@"%@ initialize", self);
}
@end
@interface EOCSubClass : EOCBaseClass
@end
@implementation EOCSubClass
@end
当使用EOCSubClass类时,控制台会输出两次打印方法:
EOCBaseClass initialize
EOCSubClass initialize
因为子类EOCSubClass并没有覆写initialize方法,那么自然会调用其父类EOCBaseClass的方法。
解决方案是通过检测类的类型的方法:
+ (void)initialize {
if (self == [EOCBaseClass class]) {
NSLog(@"%@ initialized", self);
}
}
这样一来,EOCBaseClass的子类EOCSubClass就无法再调用initialize方法了。
我们可以察觉到,如果在这个方法里执行过多的操作的话,会使得程序难以维护,也可能引起其他的bug。
因此,在initialize方法里,最好只是设置内部的数据,不要调用其他的方法,
因为将来可能会给这些方法添加其它的功能,那么会可能会引起难以排查的bug。
本文标题:精简initialize 与 load的实现代码
本文链接:https://www.haomeiwen.com/subject/kpogqxtx.html
网友评论