Object Runtime
int main(int argc, char * argv[]) {
NSLog(@"%s",__func__);
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
#import "Person.h"
@implementation Person
+ (void)load{
NSLog(@"%s",__func__);
}
+ (void)initialize{
[super initialize];
NSLog(@"%s %@",__func__,[self class]);
}
- (instancetype)init{
if (self = [super init]) {
NSLog(@"%s",__func__);
}
return self;
}
@end
@implementation Girl
+ (void)load{
NSLog(@"%s ",__func__);
}
+ (void)initialize{
[super initialize];
NSLog(@"%s ",__func__);
}
- (instancetype)init{
if (self = [super init]) {
NSLog(@"%s",__func__);
}
return self;
}
@end
執(zhí)行操作
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person * p1 = [Person new];
Person * p2 = [Person new];
Girl *c1 = [Girl new];
Girl *c2 = [Girl new];
}
@end
執(zhí)行結(jié)果:
+[Person load]
+[Girl load]
main
+[Person initialize] Person
-[Person init]
-[Person init]
+[Person initialize] Girl
+[Girl initialize]
-[Person init]
-[Girl init]
-[Person init]
-[Girl init]
在沒(méi)有對(duì)類(lèi)做任何操作的情況下州胳,+load 方法會(huì)被默認(rèn)執(zhí)行删咱,并且是在 main 函數(shù)之前執(zhí)行的片挂。
initialize 方法類(lèi)似一個(gè)懶加載列林,如果沒(méi)有使用這個(gè)類(lèi),那么系統(tǒng)默認(rèn)不會(huì)去調(diào)用這個(gè)方法烛愧,且默認(rèn)只加載一次油宜;
initialize 的調(diào)用發(fā)生在 +init 方法之前.
在所有超類(lèi)的+加載方法之后調(diào)用類(lèi)的+ load方法掂碱。
在類(lèi)自己的+ load方法之后調(diào)用category + load方法。
- load和initialize方法都會(huì)在實(shí)例化對(duì)象之前調(diào)用验庙,以main函數(shù)為分水嶺顶吮,前者在main函數(shù)之前調(diào)用社牲,后者在之后調(diào)用粪薛。這兩個(gè)方法會(huì)被自動(dòng)調(diào)用,不能手動(dòng)調(diào)用它們搏恤。
- load和initialize方法都不用顯示的調(diào)用父類(lèi)的方法而是自動(dòng)調(diào)用违寿,即使子類(lèi)沒(méi)有initialize方法也會(huì)調(diào)用父類(lèi)的方法,而load方法則不會(huì)調(diào)用父類(lèi)熟空。
- load方法通常用來(lái)進(jìn)行Method Swizzle藤巢,initialize方法一般用于初始化全局變量或靜態(tài)變量。
- load和initialize方法內(nèi)部使用了鎖息罗,因此它們是線(xiàn)程安全的掂咒。實(shí)現(xiàn)時(shí)要盡可能保持簡(jiǎn)單,避免阻塞線(xiàn)程迈喉,不要再使用鎖绍刮。