+ (void)load;
+ (void)initialize;
load:load方法在这个文件被程序装载时调用。只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用。
int main(intargc,char* argv[]) {
@autoreleasepool{
NSLog(@"main");
returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass]));
}
+ (void)load{
NSLog(@"load");
}
+(void)initialize{
NSLog(@"initialize");
}
一。load特点:
1.当这个类被引用到程序中,就会执行一次这个类的load方法且只有一次。对于加入运行期系统中的每个类(class)及分类(category)来说,都会调用此方法,且只会调用一次。如果分类和其所属的类都调用了load方法,则先调用类里面的,再调用分类里的。
2.如果一个类实现了load方法,在调用这个方法前会首先调用父类的load方法。而且这个过程是自动完成的,并不需要我们手动实现。如果类里没有load方法,不管其父类有没有load方法,都不会在执行子类load方法时执行父类的load方法。
用途:比如说你想要自定义导航栏,那么你就可以用load方法
+ (void)load
{
UINavigationBar*navBar = [UINavigationBarappearanceWhenContainedIn:self,nil];
//只要是通过模型设置,都是通过富文本设置
//设置导航条标题=> UINavigationBar
NSMutableDictionary*attrs = [NSMutableDictionarydictionary];
attrs[NSFontAttributeName] = [UIFontboldSystemFontOfSize:20];
[navBarsetTitleTextAttributes:attrs];
//设置导航条背景图片
[navBarsetBackgroundImage:[UIImageimageNamed:@"navigationbarBackgroundWhite"]forBarMetrics:UIBarMetricsDefault];
[navBarsetTitleTextAttributes:[NSDictionarydictionaryWithObjectsAndKeys:[UIColorwhiteColor],NSForegroundColorAttributeName,nil]];
}
二。initialize方法特点:
1. initialize的自然调用是在第一次主动使用当前类的时候。只会调用一次。
2. 和load不同,即使子类不实现initialize方法,会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super调用。
父类:
+(void)initialize{
NSLog(@"initializeParent--%@",[selfclass]);
}
子类:没有实现initalize方法
打印结果看出调用了两次父类的方法。
第一次是创建的父类对象执行了这个方法,因为在创建子类对象前要先创建父类对象,第二次是子类继承父类的方法执行这个方法。所以正确的写法是:
+(void)initialize{
if(self==[ViewControllerclass]){
NSLog(@"initializeParent--%@",[selfclass]);
}
}
相同点:
1.load和initialize方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。
2.在不考虑开发者主动使用的情况下,系统最多会调用一次。
3.都不需要super。
不同点:
1.load方法通常用来进行Method Swizzle,initialize方法一般用于初始化全局变量或静态变量。
2.调用时间不同。
3.load不遵守继承规则,即子类如果没有load方法,那么在要执行子类load方法时不会执行父类load方法。
initialize遵守继承的规则,即子类不管有没有这个方法,都会执行父类的这个方法。