引子 — 和`@interface` 從一開始學習Objc,我們就“知道”定義一個類時後一種寫法才是正確的。然而如果你試了的話,會發現第一種也是OK的。 言歸正傳 為什麼會有這篇文章呢,源於ReactiveCocoa這個開源庫里定義的幾個巨集: @weakify, @strongify, @WS, @ ...
引子 —
@ 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{} .....
結合之前的結論,哦,原來黑魔法是這樣的。