load
- load方法只會調(diào)用一次,只要引入頭文件就會調(diào)用#import
- 如果一個(gè)類調(diào)用了load方法,會自動調(diào)用其父類的load方法,不用再load方法中不需手動實(shí)現(xiàn),是自動調(diào)用父類的load方法
- 如果沒有實(shí)現(xiàn)load方法,那么不會調(diào)用父類的load方法
- load方法是線程安全的,不要做耗時(shí)操作,會阻塞線程
- 在load方法中可以runtime進(jìn)行方法交換
+ (void)load {
Method current = class_getInstanceMethod([self class], @selector(originalFunc));
Method change = class_getInstanceMethod([self class], @selector(swizzledFunc));
method_exchangeImplementations(current, change);
}
initialize
initialize方法在第一次創(chuàng)建時(shí)調(diào)用,跟load一樣只調(diào)用一次
如果子類沒有使用initialize方法,一樣會調(diào)用父類的initialize方法
-
使用的時(shí)候,為了保證initialize只調(diào)用一次,應(yīng)該做一個(gè)判斷,為當(dāng)前類時(shí)調(diào)用,不然什么都不做
+ (void)initialize { if (self == [CurrntObject class]) { } }
總結(jié)
- 都不能手動調(diào)用load和initialize
- load用來進(jìn)行基于運(yùn)行時(shí)的方法交換,initialize用來初始化靜態(tài)變量或者全局變量
- 都是線程安全的,不要進(jìn)行耗時(shí)操作和一些可能阻塞線程的操作