ReactiveCocoa中的宏

weakify

源碼:

#define weakify(...) \
    autoreleasepool {} \
    metamacro_foreach_cxt(rac_weakify_,, __weak, __VA_ARGS__)

使用方法:

@weakify(anObject);
//展開后
@autoreleasepool{

}
metamacro_foreach_cxt(rac_weakify_,,__weak,__VA_ARGS__)

這里有兩個(gè)問題:

  • autoreleasepool的作用是什么?
  • metamacro_foreach_cxt干了什么 ?

在使用這兩個(gè)宏時(shí),為了看起來符合libextobjc的語言習(xí)慣,前面會加上@,所以autoreleasepool僅僅是為了配合使用宏的是@符號。

再看后者:

/**
* 對于每個(gè)參數(shù),使用MACRO進(jìn)行處理,然后使用SEP分隔
*/
#define metamacro_foreach_cxt(MACRO, SEP, CONTEXT, ...) \
        metamacro_concat(metamacro_foreach_cxt, metamacro_argcount(__VA_ARGS__))(MACRO, SEP, CONTEXT, __VA_ARGS__)

其中:

metamacro_concat(A,B) \\拼接A,B兩個(gè)字符串
metamacro_argcount(...) \\返回參數(shù)的個(gè)數(shù)

所以展開后:

@weakify(anObject);
//展開后
@autoreleasepool{

}
metamacro_foreach_cxt1(rac_weakify_,,__weak,__VA_ARGS__)
//繼續(xù)展開
@autoreleasepool{

}
rac_weakify(0,__weak, anObject)
//rac_weakify展開后
@autoreleasepool{

}
__weak __typeof__(anObject) anObject_weak_ = (anObject)

所以最終weakify定義了一個(gè)object_weak_變量,以weak方式引用object。
同樣展開strongtify宏之后,其結(jié)果是:

__strong __typeof__(anObject) anObject = anObject_weak_

所以是在block中將定義了一個(gè)局部變量object指向了object_weak_

RACObserve

定義:

#define RACObserve(TARGET, KEYPATH) \
    [(id)(TARGET) rac_valuesForKeyPath:@keypath(TARGET, KEYPATH) observer:self]

這里看主要是調(diào)用了rac_valuesForKeyPath方法,而這個(gè)方法的參數(shù)使用了另一個(gè)宏keypath

#define keypath(...) \
    metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__))(keypath1(__VA_ARGS__))(keypath2(__VA_ARGS__))

#define keypath1(PATH) \
    (((void)(NO && ((void)PATH, NO)), strchr(# PATH, '.') + 1))

#define keypath2(OBJ, PATH) \
    (((void)(NO && ((void)OBJ.PATH, NO)), # PATH))

metamacro_if_eq的作用就是如果參數(shù)數(shù)量等于1,就執(zhí)行keypath1,否則執(zhí)行keypath2(其實(shí)這里metamacro_if_eq的實(shí)現(xiàn)方式也值得看一下)。自動(dòng)提示就是通過OBJ.PATH來做的,keypath2返回的其實(shí)就是PATH的字符串形式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容