Значение макросов 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)