Objective-C宏的含义以at(@)符号为前缀

时间:2013-12-31 18:44:45

标签: objective-c macros reactive-cocoa

ReactiveCocoa框架使用weakifystrongify宏,这两个宏前面都有一个'@'符号。

以下是一个示例(来自此file)。

- (RACSignal *)rac_textSignal {
        @weakify(self);
        return [[[[RACSignal
                ... 
               ];
}

作为宏名称前缀的at符号有什么意义? (注意:我已经检查了宏,它被称为'弱化',而不是'@weakify',因此它不仅仅是宏名称!)。

宏本身在这里定义:

https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h#L45

2 个答案:

答案 0 :(得分:18)

@开头的宏没有特殊含义。这是在libextobjc中完成的,以使@weakify@strongify宏看起来与其他语言更加惯用。

从技术上讲,@不是宏的一部分。宏只是weakifystrongify。但是,宏的实际主体是这样编写的,除非前面有@,否则它不会编译。这是通过在宏的开头添加一个空的@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)