Objective-C load与initialize

Objective-C  load与initialize

一、 + (void) load

当包含类或分类的程序库载入系统时,就会执行此方法,而这通常是指应用程序启动的时候,若程序视为iOS平台设计的,则肯定是在此时执行。

Mac OS X 应用程序自由一些,他们可以使用动态加载(dynamic loading)之类的特性,等应用程序启动好之后再去加载程序库

特性

执行顺序:先类里,再分类;执行子类load前,先执行超类的

执行 load 方法时,运行期系统处于“脆弱状态”,不能安全的使用任意类中的方法

不遵从普通方法的继承规则:如果某类并未实现 load 方法,无论超类是否实现,都不会调用

load 应尽量精简:因为应用程序在执行 load 方法时会被阻塞

load 方法里不能调用其他类(其他类可能未载入),不能调用等待锁以及可能加锁的方法(可能阻塞程序)

子类的 load 方法不需要调用父类的该方法

二、 + (void) initialize

该方法会在程序首次用该类之前调用,它是由运行期系统调用的,绝不应该通过代码直接调用

特性

惰性调用(用到时某个类时才会调用)

执行 initialize 方法时,运行期系统处于“正常状态”,可以安全使用任意类中的方法

线程安全

和普通方法一样,子类未实现,超类实现了,会调用超类的

如果全局变量无法再编译期初始化(比如Objective - C对象),可放在 initialize 里

#import"A.h"

//报错

//static NSMutableArray *kTestArray=[[NSMutableArray alloc] init];

staticNSMutableArray*kTestArray;

@implementationA

+ (void)initialize{

//此方法通常这样使用

//只有开发者期望的那个类载入系统时,才执行相关操作,这个视情况而定

if(self==[A class]) {

kTestArray=[[NSMutableArrayalloc] init];

}

}

@end

initialize 坑

如果初次用到的线程正好为UI线程,程序将会阻塞

无法控制初始化时机。如果程序以来某个时间点,但是运行期系统更新,初始化时间点如果改变,问题就出现了

可能产生“依赖环”, 如果 A 类的 initialize 方法用到B类,B类还没初始化,系统会强行初始化,此时A类还没初始化完成。如果B类实现initialize方法时用到A类的数据,此时A类的数据尚未完成,“依赖环”由此产生

你可能感兴趣的:(Objective-C load与initialize)