load
- load方法只会调用一次,只要引入头文件就会调用#import
- 如果一个类调用了load方法,会自动调用其父类的load方法,不用再load方法中不需手动实现,是自动调用父类的load方法
- 如果没有实现load方法,那么不会调用父类的load方法
- load方法是线程安全的,不要做耗时操作,会阻塞线程
- 在load方法中可以runtime进行方法交换
+ (void)load {
Method current = class_getInstanceMethod([self class], @selector(originalFunc));
Method change = class_getInstanceMethod([self class], @selector(swizzledFunc));
method_exchangeImplementations(current, change);
}
initialize
initialize方法在第一次创建时调用,跟load一样只调用一次
如果子类没有使用initialize方法,一样会调用父类的initialize方法
-
使用的时候,为了保证initialize只调用一次,应该做一个判断,为当前类时调用,不然什么都不做
+ (void)initialize { if (self == [CurrntObject class]) { } }
总结
- 都不能手动调用load和initialize
- load用来进行基于运行时的方法交换,initialize用来初始化静态变量或者全局变量
- 都是线程安全的,不要进行耗时操作和一些可能阻塞线程的操作