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