【问题标题】:Meaning of Objective-C macros prefixed with an at (@) symbol以 at (@) 符号为前缀的 Objective-C 宏的含义
【发布时间】:2014-01-18 15:50:10
【问题描述】:

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

这是一个例子(来自file)。

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

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

宏本身在这里定义:

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

【问题讨论】:

标签: objective-c macros reactive-cocoa


【解决方案1】:

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

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

【讨论】:

  • 谢谢!虽然我个人认为这很令人困惑。为什么要让这些宏看起来比其他宏更“特别”?
  • 只是来这里说这可能是我很长时间以来见过的最聪明的 autoreleasepool 用法
【解决方案2】:

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

#define weakify(...) \
    autoreleasepool {} \
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__)

所以@weakify(self) 变成:

@autorelease {} metamacro_foreach_cxt(ext_weakify_,, __weak, self)

【讨论】:

  • 谢谢!但是为什么不在宏中包含@呢?
  • 我唯一的猜测是宏作者试图巧妙地使宏看起来需要在宏名称前加上@
  • 光滑?也许,令人困惑......绝对!为什么要让它看起来像一个语言功能,而实际上它不是?那好吧。谢谢!
  • 我对“slick”这个词的使用并不是恭维。 :) 我同意这是个坏主意。
  • @ColinE 它们执行的任务实际上更多是在语言级别(操作变量声明)而不是典型的宏或函数调用,@ 增加了视觉重量。这也是为了与@synchronized 等进行比较,尽管在实践中显然用法有点不同。
猜你喜欢
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
相关资源
最近更新 更多