带有@符号前缀的Objective-C宏的含义

16

ReactiveCocoa框架使用weakifystrongify宏,两者均以'@'符号为前缀。

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

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

在宏名称前使用@符号的意义是什么?(注意:我已经检查了宏,它被称为'weakify'而不是'@weakify',所以这不仅仅是宏名称!)
宏本身在此处定义:

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


谢谢,但这不是那个问题的重复。Weakify不是一个语言关键字。 - ColinE
2
可能是如何在Objective-C宏中使用商业at符号?的重复问题。 - Martin R
2个回答

18

@ 开头的宏并没有特殊含义。这是在 libextobjc 中为了让 @weakify@strongify 宏看起来更符合语言习惯而做出的处理。

从技术上讲,@ 并不是宏的一部分。宏只有 weakify 或者 strongify。不过,宏的实际体现是通过在它之前加上 @ 来确保编译通过的。这是通过在宏的开头添加一个空的 @autoreleasepool {} 来实现的,然后在去掉前面的 @


谢谢!尽管我个人认为这很令人困惑。为什么要让这些宏看起来比其他宏更“特别”呢? - ColinE
1
我只是来说这可能是我长时间以来看到的最聪明的autoreleasepool使用方式。 - jere

7

@符号不是宏的一部分。weakify的定义如下:

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

因此,@weakify(self) 变成了:

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

谢谢!但为什么宏中不包括“@”? - ColinE
我唯一的猜测是宏作者试图巧妙地使宏在名称前出现@ - rmaddy
Slick?可能吧,令人困惑……肯定的!为什么要让它看起来像一种语言特性呢,明明不是呢?哎,谢谢! - ColinE
我的“slick”一词的使用并不是在赞美。 :) 我同意这是个坏主意。 - rmaddy
3
他们执行的任务实际上更多地涉及语言层面(操作变量声明),而不是您通常的宏或函数调用, "@" 添加了视觉重量。它也旨在与@synchronized等进行类比,尽管在实践中使用方式有些不同。 - Justin Spahr-Summers
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接