ReactiveCocoa框架使用weakify
和strongify
宏,两者都以"@"符号开头.
这是一个例子(来自这个文件).
- (RACSignal *)rac_textSignal { @weakify(self); return [[[[RACSignal ... ]; }
作为宏名称前缀的at符号有什么意义?(注意:我已经检查了宏,它被称为'弱化',而不是'@weakify',因此它不仅仅是宏名称!).
宏本身在这里定义:
https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h#L45
这@
不是宏的一部分.weakify
定义为:
#define weakify(...) \ autoreleasepool {} \ metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__)
所以@weakify(self)
就变成了:
@autorelease {} metamacro_foreach_cxt(ext_weakify_,, __weak, self)
对于以@
.开头的宏没有特殊含义.这是在libextobjc中完成的,以使得@weakify
和@strongify
宏在语言的其余部分看起来更加惯用.
从技术上讲,@
它不是宏观的一部分.宏只是weakify
或strongify
.但是,宏的实际主体是这样编写的,除非在前面加上,否则它不会编译@
.这是通过@autoreleasepool {}
在宏的开头添加一个空来完成的,但是剥离了前导@
.