由于近几年一直在敲 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,便可以获得并使用全局变量。

当然还有一个局部静态变量, 就是在块 {} 中可以访问, 他与普通局部变量的区别就是, 局部静态变量 的作用是保持变量内容的持久。