一、ios中的load和initialize的简单介绍
load方法当类被加载到OC运行时环境中的时候就会调用,其实就是被加载进内存,一个类只会加载一次,我们如果要设置单例也完全可以在这个方法中进行创建,头文件参与了编译也会调用下面的方法
+(void)load
{
}
当第一次使用这个类的时候就会调用
+(void)initialize
{
}
load是比initialize先调用的,initialize可能是我们在创建子类alloc init的时候也会去调用父类的initialize方法。因为init的时候会用到super init。
initialize不一定只调用一次,比如说我们创建一个子类,如果只有父类的方法写了initialize的方法,那么就会调用两次父类的initialize的方法. 比如下面有一个Student类
@implementation Student
+(void)initialize
{
NSLog(@"Student");
}
@end
还有个Student1的子类,什么都没写
@implementation Student1
@end
当我们去创建一个子类对象的时候,父类实现的initialize会被调用两次,因为[super init]会调用,而且虽然子类没有实现initialize方法,但还是会调用会使用父类的+(void)initialize。
Student1 * student = [[Student1 alloc]init];
![](https://i-blog.csdnimg.cn/blog_migrate/4a4956b8f8dc56c1e8ec1207d212ee6c.jpeg)
所以如果子类不实现初始化(运行时将调用继承的实现),或者子类显式调用[super initialize],超类实现可能会被多次调用。如果希望保护自己不被多次运行,我们可以按照以下的方式来构造我们的实现: 其中Student就是可以改为你当前类的名字
@implementation Student
+ (void)initialize {
if (self == [Student self]) {
// ... do the initialization ...
NSLog(@"Student");
}
}
@end
因为初始化被称为阻塞方式,所以将方法实现限制到尽可能少的工作是很重要的。
我们一般是在initialize 方法中进行一些常量的初始化,初始化全局变量和静态变量。
load方法在main函数之前调用,initialize在main函数之后调用。initialize方法可以说是一种惰性调用,也就是说如果一个类一直没被用到,那它的initialize方法也不会被调用,这一点有利于节约资源。
二、补充概念
如果说我们有一个类Student,它有一个分类Student+Extension,而且两个类都是写了load方法的话,那么Student类的load方法会先被调用,然后再调用子类的load方法,然后再调用main方法。