OC 中load和initialize的区别

+ (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方法,在执行这个类的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遵守继承的规则,即子类不管有没有这个方法,都会执行父类的这个方法。

推荐阅读更多精彩内容