Load方法和initialize方法

+ (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;是啥意思不知道。

你可能感兴趣的:(Load方法和initialize方法)