#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]
答案 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
等