iOS +load 和 +initialize

Objective-C有两个神奇的方法:+load 和 +initialize,这两个方法在类被使用时会自动调用。但是两个方法的不同点会导致应用层面上性能的显著差异。

+ initialize方法和+load 调用时机:

(1)首先说一下+ initialize方法:苹果官方对这个方法有这样的一段描述:这个方法会在第一次初始化这个类之前被调用,我们用它来初始化静态变量。

(2)load方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载所有的类,就会调用每个类的 + load 方法。

这说明在我并没有对类做任何操作的情况下,+load方法会被默认执行,并且是在 main 函数之前执行的。当类被引用进项目的时候就会执行load函数(在main函数开始执行之前),与这个类是否被用到无关,每个类的load函数只会自动调用一次.由于load函数是系统自动加载的,因此不需要再调用[super load],否则父类的load函数会多次执行。

initialize在类或者其子类的第一个方法被调用前调用,而且仅调用一次。即使类文件被引用进项目,但是没有使用,initialize不会被调用。由于是系统自动调用,也不需要显式的调用父类的initialize,否则父类的initialize会被多次执行。假如这个类放到代码中,而这段代码并没有被执行,这个函数是不会被执行的。

init与initialize的区别init在类实例化(new)的时候就会调用一次,initialize在向类发送消息的时候调用一次。只要new一次,init就会调用一次,new多少次,init就调用多少次,但initialize只会调用一次。

例子:用NSString类创建了7个NSString对象

1>调用了1次initialize方法;

2>调用7次init方法

总结:

1.load和initialize都会在实例化对象之前调用,以main函数为分水岭,前者是在main函数之前,后者是在main函数之后。

2.load和initialize方法都不会显式的调用父类的方法而是自动调用,即使子类没有initialize方法也会调用父类的方法,load方法不会调用父类的方法。

3.load和initialize方法内部使用了锁,因此他们是线程安全的,实现时要尽可能简单,避免线程阻塞,不要再次使用锁。

4.load方法常用来method swizzle,initialize常常用于初始化全局变量和静态变量。

你可能感兴趣的:(iOS +load 和 +initialize)