美文网首页
精简initialize 与 load的实现代码

精简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