黑魔法: @ interface VS @interface

  • 引子 — @ interface@interface

    从一开始学习Objc,我们就“知道”定义一个类时后一种写法才是正确的。然而如果你试了的话,会发现第一种也是OK的。

  • 言归正传

    为什么会有这篇文章呢,源于ReactiveCocoa这个开源库里定义的几个宏:

    @weakify, @strongify, @WS, @SS   

    看到这样几个玩意,做一个瘾君子看到毒品的比喻完全不为过,好奇心一下子就上来了,他定义的宏怎么使用起来在语法上会和系统关键字一样呢?
    让我们揪出源代码来批斗下吧:

    #define weakify(...) \
        rac_keywordify \
        metamacro_foreach_cxt(rac_weakify_,, __weak, __VA_ARGS__)

    rac_keywordify又是个什么玩意?

    #if DEBUG
    #define rac_keywordify autoreleasepool {}
    #else
    #define rac_keywordify try {} @catch (...) {}
    #endif

    所以最终生成的代码就形如

        @ autoreleasepool{} ....
        或者
        @ try{} .....   

    结合之前的结论,哦,原来黑魔法是这样的。

你可能感兴趣的:(黑魔法: @ interface VS @interface)