@strongify的实现

时间:2014-05-19 06:13:00

标签: objective-c

#define strongify(...) \
    try {} @finally {} \
    _Pragma("clang diagnostic push") \
    _Pragma("clang diagnostic ignored \"-Wshadow\"") \
    metamacro_foreach(mtl_strongify_,, __VA_ARGS__) \
    _Pragma("clang diagnostic pop")

我阅读了metamacro_foreach的源代码并手动扩展了一个案例,为什么SEP没有任何内容

strongify()。如果有人可以解释这段代码,那真是太好了。 metamacro_foreach的源代码:

[https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/metamacros.h#L53]

1 个答案:

答案 0 :(得分:0)

仅存在

try {} @finally {}以使编译器对宏之前的额外@符号感到满意。

所以@strongify(...)扩展为类似

的内容
@try {} @finally {} 
_Pragma("clang diagnostic push") 
_Pragma("clang diagnostic ignored \"-Wshadow\"") 
// something....
_Pragma("clang diagnostic pop")

您可以从宏中删除try {} @finally {}并将其用作strongify(...),它也可以使用。

但我认为宏的作者希望它前面有@符号,使其看起来像真正的Objective-C语法,因为大多数ObjC关键字都以@符号开头。例如@autoreleasepool@try