类的初始化
类必须先执行某些初始化操作,然后才能正常使用。OC中,绝大多数类都继承NSObject根类,该类有俩个方法用来实现初始化操作
代码语言:javascript复制 (void)load
(void)initialize
(void)load
- 对于加入运行期系统的每个类及分类来说,必定会调用此方法,而且仅此一次
- 若类本身或分类都定义load方法,则先调用类里的,在调用分类的
- 在执行load方法之前,必定先执行所有超类的load方法,如果代码还依赖了其他程序库,那么库里相关类的load方法也必定会执行
注:对于某个程序库,无法判断其中各个类加载的顺序,因此在load类加载其他类是不安全的
代码语言:javascript复制#import "Person.h"
#import "Student.h"
@implementation Person
(void)load{
Student *stu = [[Student alloc]init];
}
@end
//无法判断Student这个类是否已经加载完毕,只有Student加载完毕之后,在可以使用,所以,在load类加载其他类是不安全的
- load方法不遵从继承规则,如果某个类本身没有实现load方法,那么不管各级超类是否实现load方法,系统都不会调用
- load方法务必实现得精简尽量少执行操作
(void)initialize
- 对于每个类来说,initialize方法会在程序首次用该类之前调用,且只调用一次
- initialize方法遵从继承规则,如果某个类没有实现它,而其超类实现了,那么就会运行其超类的实现代码
- initialize方法务必实现得精简尽量少执行操作
- initialize方法只应该用来设置内部数据,不应该调用其他方法
load与initialize的区别与相同点
- load方法会把应用程序所有类load都执行完,才能继续其他逻辑;initialize是用哪个类执行哪个类,且为懒加载
- initialize方法在运行期由系统调用,是处于正常状态的,线程也是安全的,而运行期执行load方法时不安全的
- load与initialize方法都应该实现得精简一些,这有助于保持应用程序的响应能力,也能减少引入的几率