+ (void)Load方法在main函數(shù)執(zhí)行之前執(zhí)行牌捷。并且每一個類都會被執(zhí)行一次芯侥,如果一個類有很多category溜在,每個category的load方法都會被執(zhí)行一次。
子類的load方法執(zhí)行時呻引,父類的load方法已經(jīng)被執(zhí)行了。此時framwork的所有方法都可以被調用吐咳。
適合在load方法中進行方法交換逻悠、注冊類方法等。
+(void)initialize是懶加載的韭脊。在第一個實例化對象或第一個類方法被調用前執(zhí)行童谒,且僅僅執(zhí)行一次。這個方法和普通的方法類似沪羔,如果在子類中沒有聲明惠啄,會查找父類中的方法,并執(zhí)行任内。
@interfaceTestLoad :NSObject
@end
@interfaceTestLoadSubclass :TestLoad
- (void)testMethod;
@end
.m文件
@implementationTestLoad
+(void)load
{
NSLog(@"load TestLoad");
}
+(void)initialize
{
NSLog(@"initialize TestLoad");
}
@end
@implementationTestLoadSubclass
+(void)load
{
NSLog(@"load TestLoadSubclass");
}
+(void)initialize
{
NSLog(@"initialize TestLoadSubclass");
}
- (void)testMethod
{
NSLog(@"sub class receive message");
}
@end
在ViewDidLoad里調用
TestLoadSubclass*obj =[[TestLoadSubclassalloc]init];
[objtestMethod];
結果如下
2016-05-21 09:23:19.403 TestLoad[5608:229623] load TestLoad
2016-05-21 09:23:19.404 TestLoad[5608:229623] load TestLoadSubclass
2016-05-21 09:23:19.405 TestLoad[5608:229623] before main
2016-05-21 09:23:19.487 TestLoad[5608:229623] initialize TestLoad
2016-05-21 09:23:19.488 TestLoad[5608:229623] initialize TestLoadSubclass
2016-05-21 09:23:19.488 TestLoad[5608:229623] sub class receive message
如果把子類的+(void)initialize方法注釋掉撵渡,結果如下
2016-05-21 09:24:19.952 TestLoad[5632:231755] load TestLoad
2016-05-21 09:24:19.953 TestLoad[5632:231755] load TestLoadSubclass
2016-05-21 09:24:19.954 TestLoad[5632:231755] before main
2016-05-21 09:24:20.024 TestLoad[5632:231755] initialize TestLoad
2016-05-21 09:24:20.024 TestLoad[5632:231755] initialize TestLoad
2016-05-21 09:24:20.024 TestLoad[5632:231755] sub class receive message
2016-05-21 09:24:20.024 TestLoad[5632:231755]module name
可以看到,由于子類中沒有initialize方法死嗦,所以調用來父類的方法趋距。一般來說,需要在父類中做一個判斷越除。
+(void)initialize
{
if(self== [TestLoadclass])
{
NSLog(@"initialize TestLoad");
}
}
在ReactNative中节腐,通過load方法注冊了模塊。
#define RCT_EXPORT_MODULE(js_name) \
RCT_EXTERN void RCTRegisterModule(Class); \
+ (NSString *)moduleName { return @#js_name; } \
+ (void)load { RCTRegisterModule(self); }
voidRCTRegisterModule(Class moduleClass)
{
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
RCTModuleClasses= [NSMutableArray new];?
});
RCTAssert([moduleClassconformsToProtocol:@protocol(RCTBridgeModule)],
@"%@ does not conform to the RCTBridgeModule protocol",
moduleClass);
// Register module
[RCTModuleClasses addObject:moduleClass];
}
這樣子摘盆,只要在模塊中引入RCT_EXPORT_MODULE翼雀,就在此類中聲明了load方法,從而注冊了此模塊孩擂。
不過@#js_name;是啥意思不知道狼渊。