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

Col*_*inE 16 macros objective-c reactive-cocoa

ReactiveCocoa框架使用weakifystrongify宏,两者都以"@"符号开头.

这是一个例子(来自这个文件).

- (RACSignal *)rac_textSignal {
        @weakify(self);
        return [[[[RACSignal
                ... 
               ];
}
Run Code Online (Sandbox Code Playgroud)

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

宏本身在这里定义:

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

BJ *_*mer 18

对于以@.开头的宏没有特殊含义.这是在libextobjc中完成的,以使得@weakify@strongify宏在语言的其余部分看起来更加惯用.

从技术上讲,@它不是宏观的一部分.宏只是weakifystrongify.但是,宏的实际主体是这样编写的,除非在前面加上,否则它不会编译@.这是通过@autoreleasepool {}在宏的开头添加一个空来完成的,但是剥离了前导@.


rma*_*ddy 7

@不是宏的一部分.weakify定义为:

#define weakify(...) \
    autoreleasepool {} \
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

所以@weakify(self)就变成了:

@autorelease {} metamacro_foreach_cxt(ext_weakify_,, __weak, self)
Run Code Online (Sandbox Code Playgroud)

  • @ColinE它们执行的任务在语言级别(操作变量声明)比典型的宏或函数调用更多,并且@增加了视觉权重.它也意味着与`@ synchronized`等相似,虽然显然在实践中使用有点不同. (3认同)