+(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
网友评论