+ (void)Load方法在main函数执行之前执行。并且每一个类都会被执行一次,如果一个类有很多category,每个category的load方法都会被执行一次。
子类的load方法执行时,父类的load方法已经被执行了。此时framwork的所有方法都可以被调用。
适合在load方法中进行方法交换、注册类方法等。
+(void)initialize是懒加载的。在第一个实例化对象或第一个类方法被调用前执行,且仅仅执行一次。这个方法和普通的方法类似,如果在子类中没有声明,会查找父类中的方法,并执行。
@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;是啥意思不知道。