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

+(void)load与+(void)initialize初探

针对的概念

1,IOS会在运行期提前并且自动调用这两个方法。
2,load和initialize的区别在于:load是只要类所在文件被引用,就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。

示例代码一
@interface SuperClass:NSObject
@end
@implementation SuperClass
+(void)initialize{
    NSLog(@"%@ %s",[self class], __FUNCTION__);
}
+(void)load{
    NSLog(@"%@ %s",[self class], __FUNCTION__);
}
@end
示例代码二
@interface Insideinitialize:NSObject
@end
@implementation Insideinitialize
+(void)initialize{
    NSLog(@"%@ %s",[self class], __FUNCTION__);
}
+(void)load{
    NSLog(@"%s", __FUNCTION__);
}
@end

示例代码一中:

SuperClass重写了load和initialize方法,并分别在两个方法中调用Class类方法打印当前类的名字以及打印当前运行的方法名字

示例代码二中:

Insideinitialize重写的load方法中,去除了对Class方法的调用。

现在我们在Xcode的项目中只简单的import这两个类,而不去使用它们。然后运行项目,获得下面的结果:

//示例代码一
SuperClass +[SuperClass initialize]
SuperClass +[SuperClass load]
//示例代码二
+[Insideinitialize load]
根据打印结果,可以看出:

示例代码一中:SuperClass的load方法和initialize都有被调用。因为SuperClass所在文件被工程引用,所以运行期会提前并自动调用它的load方法。同时,由于load方法中调用了[self class]类方法,也就是此时SuperClass的第一个方法被调用,则在调用该类方法之前,运行期会自动调用initialize方法。所以,两个方法都被运行期提前并自动运行,同时,initialize方法先于load方法执行。
示例代码二中:initialize方法没有被调用也就是情理之中了。

彩蛋:Runtime对类的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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容