Значение макросов Objective-C с префиксом at (@)
В инфраструктуре ReactiveCocoa используются макросы weakify
и strongify
, каждому из которых предшествует символ "@".
Вот пример (из этого файла).
- (RACSignal *)rac_textSignal {
@weakify(self);
return [[[[RACSignal
...
];
}
Каково значение символа at, который является префиксом имени макроса? (ПРИМЕЧАНИЕ. Я проверил макрос, и он называется "слабый", а не "@weakify", поэтому это не просто имя макроса!).
Сам макрос определяется здесь:
https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h#L45
Ответы
Ответ 1
Макрос не имеет особого значения, начиная с @
. Это делается в libextobjc, чтобы макросы @weakify
и @strongify
казались более идиоматичными с остальной частью языка.
Технически, @
не является частью макроса. Макрос просто weakify
или strongify
. Фактическое тело макроса, тем не менее, написано так, что оно не будет компилироваться, если предшествует @
. Это делается путем добавления пустого @autoreleasepool {}
в начале макроса, но отключение ведущего @
.
Ответ 2
@
не является частью макроса. weakify
определяется как:
#define weakify(...) \
autoreleasepool {} \
metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__)
Итак, @weakify(self)
становится:
@autorelease {} metamacro_foreach_cxt(ext_weakify_,, __weak, self)