initialize 和 load 是 NSObject 的两个特殊类方法,在面试过程中很有可能会问到同时在工作中我们也可以利用其相应的特性做一些操作。
load
基本区别
- load是在程序运行时出发(加入编译文件Compile Sources),且仅调用一次,无需手动调用。
- load 方法不遵从继承规则,如果类本身没有实现load方法,那么系统就不会调用,谁实现就会调用谁的load方法。
- 尽可能的精简load方法,因为整个应用程序在执行load方法时会阻塞,即,程序会阻塞直到所有类的load方法执行完毕,才会继续
- load 方法中最常用的就是方法交换method swizzling
实例分析
开发文档说明:

- 创建类及其load方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| + (void)load{NSLog(@"class == People,method == load");}
+ (void)load{NSLog(@"class == Student,method == load");}
+ (void)load{NSLog(@"class == Teacher,method == load");}
+ (void)load{NSLog(@"class == People (Ext),method == load");}
+ (void)load{ Method personMethod = class_getInstanceMethod([Person class], NSSelectorFromString(@"personSay")); Method studentMethod = class_getInstanceMethod([Student class], NSSelectorFromString(@"studentSay"));
method_exchangeImplementations(personMethod, studentMethod); }
|
- 运行结果
initalize
基本区别
- 当某个类第一次收到消息的时候触发,且只调用一次,无需手动调用。
- 父类实现initalize,子类没有实现,调用子类会同时触发父类两次
- 父类实现initalize,子类也实现,调用子类会先触发父类再触发子类
- 父类实现initalize,父类分类也实现,分类方法会覆盖父类方法,调用的是分类方法
实例分析
开发文档说明:

创建类及其initialize方法
1 2 3 4 5 6
| + (void)initialize{NSLog(@"class == %@,method == initialize",NSStringFromClass([self class]));}
+ (void)initialize{NSLog(@"class == %@,method == initialize",NSStringFromClass([self class]));}
+ (void)initialize{NSLog(@"class categary == %@,method == initialize",NSStringFromClass([self class]));}
|
运行结果
