由于近几年一直在敲 oc, 在 oc 中使用的 c 并不多, 于是把这些给忘了。
最近看 react-native 的源码的时候,最先入手的是RCT_EXPORT_MODULE()
, 这个宏到底是干嘛的那 ?
ok, 我们来看源码
1 2 3 4
| #define RCT_EXPORT_MODULE(js_name) \ RCT_EXTERN void RCTRegisterModule(Class); \ + (NSString *)moduleName { return @#js_name; } \ + (void)load { RCTRegisterModule(self); }
|
moduleName
是添加一个类方法, 可以返回定义的 js_name, 没什么好说的, 往下看 + (void)load { RCTRegisterModule(self);
重写 load
的方法, 在 load
中执行了 RCTRegisterModule
, 我们看一下, 这个方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| static NSMutableArray<Class> *RCTModuleClasses; void RCTRegisterModule(Class); void RCTRegisterModule(Class moduleClass) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ RCTModuleClasses = [NSMutableArray new]; }); RCTAssert([moduleClass conformsToProtocol:@protocol(RCTBridgeModule)], @"%@ does not conform to the RCTBridgeModule protocol", moduleClass); // Register module [RCTModuleClasses addObject:moduleClass]; }
|
ok,我们终于讲到正题, 我定义一个 Test
类, 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| //.m #import "Test.h" void RCTRegisterModule(Class moduleClass) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ RCTModuleClasses = [NSMutableArray new]; }); // Register module [RCTModuleClasses addObject:moduleClass]; } @implementation Test @end //.h void RCTRegisterModule(Class); static NSMutableArray<Class> *RCTModuleClasses; @interface Test : NSObject @end
|
当我在 APPDelegate
中, 调用和打印:
1 2 3 4
| RCTRegisterModule(self.class); NSLog(@"%@", RCTModuleClasses); log: (null)
|
这里为什么会是空的那? 我明明调用了RCTRegisterModule
, 而且RCTModuleClasses
还是一个单利, ok, 接下来我使用全局变量来试一下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| //.m #import "Test.h" NSMutableArray<Class> *RCTModuleClasses; void RCTRegisterModule(Class moduleClass) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ RCTModuleClasses = [NSMutableArray new]; }); // Register module [RCTModuleClasses addObject:moduleClass]; } @implementation Test @end //.h void RCTRegisterModule(Class); extern NSMutableArray<Class> *RCTModuleClasses; @interface Test : NSObject - (void)hahah; @end
|
当我在 APPDelegate
中, 调用和打印:
1 2 3 4 5 6
| RCTRegisterModule(self.class); NSLog(@"%@", RCTModuleClasses); log: ( AppDelegate )
|
带着疑惑 Google 了一下, 全局静态变量 和 全局变量的区别, 全局静态变量是有作用域的, 只可以被声明的.h .m / .c 中访问到, 全局变量是没有作用域的,无论在任何地方,引入一下 Test.h,便可以获得并使用全局变量。
当然还有一个局部静态变量, 就是在块 {}
中可以访问, 他与普通局部变量的区别就是, 局部静态变量 的作用是保持变量内容的持久。