yykit 是最近一個(gè)很火的開源框架,今天來研究看看yykit源碼和一些原理,剛拿到y(tǒng)ykit還是 很驚訝,來看看yykit 的目錄,功能不僅強(qiáng)大,而且是十分全面的,我們來看看他的目錄結(jié)構(gòu)

不得不驚嘆,真的好全面,一篇文章根本看不完,今天還是先從base 說起吧,

展開base 也是不少東西,先來看看這個(gè)頭文件定義了什么吊炸天的東西
一開始看就尼瑪就卡主了,
#ifdef __cplusplus
#define YY_EXTERN_C_BEGIN extern "C" {
#define YY_EXTERN_C_END }
#else
#define YY_EXTERN_C_BEGIN
#define YY_EXTERN_C_END
#endif
這是什么鬼啊,各種百度,google之后總算是有些眉目了
先看 #ifdef __cplusplus google 之后發(fā)現(xiàn) c++中定義了__cplusplus,C語言中沒有該定義。即這個(gè)是用來:識(shí)別是c代碼還是c++代碼
在看EXTERN_C ,調(diào)用extern "C"會(huì)讓c++編譯器按照c的編譯格式來編譯。多用于c++庫的頭文件。 也即是說這個(gè)在c++的環(huán)境下,會(huì)強(qiáng)制編譯器用 C 語言的規(guī)則去編譯,而不是用 C++ 語言的規(guī)則。。因?yàn)?C++ 為了實(shí)現(xiàn)函數(shù)重載會(huì)把函數(shù)名和參數(shù)等聯(lián)合起來合成一個(gè)中介的函數(shù)名,如果 C 函數(shù)也被這樣編譯會(huì)出問題,所以在我看來這個(gè)是為了兼容c++環(huán)境不會(huì)編譯報(bào)錯(cuò)。
好吧解決了這個(gè) 在往下看看有什么比較難理解的東西
接下來是一個(gè)兩重判斷的 宏定義
#ifndef YY_CLAMP // return the clamped value
#define YY_CLAMP(_x_, _low_, _high_) (((_x_) > (_high_)) ? (_high_) : (((_x_) < (_low_)) ? (_low_) : (_x_)))
#endif
咋一看不知道有什么用寫成if else 語句大概是
if(x>high)
return high;
else
{
if(x<low)
return low;
else
return x;
}
好吧接下來往下看吧
#ifndef YY_SWAP // swap two value
#define YY_SWAP(_a_, _b_) do { __typeof__(_a_) _tmp_ = (_a_); (_a_) = (_b_); (_b_) = _tmp_; } while (0)
#endif
雖然這個(gè)一眼就看出來是個(gè)交換 函數(shù)還是有兩個(gè)地方需要注意的為什么要用這個(gè)關(guān)鍵字呢typeof 還有為什么要用do while 直接用if else 不是就行了嗎
百度一下你就知道
typeof(var) 是gcc對(duì)C語言的一個(gè)擴(kuò)展保留字,用于聲明變量類型,var可以是數(shù)據(jù)類型(int, char*..),也可以是變量表達(dá)式。也即是說 變量a 還可以是個(gè)變量表達(dá)式這里吊吊的
,但為啥要用do while 這里就請(qǐng)眾大神指點(diǎn)迷津了。
就不一一解析,看一些比較特別的吧
#ifndef YYSYNTH_DUMMY_CLASS
#define YYSYNTH_DUMMY_CLASS(_name_) \
@interface YYSYNTH_DUMMY_CLASS_ ## _name_ : NSObject @end \
@implementation YYSYNTH_DUMMY_CLASS_ ## _name_ @end
#endif
這一段還是挺特別的, 但oc 編譯靜態(tài)庫 要在build setting other linker flag設(shè)置 -all_load 和-Objc才可以將category 編進(jìn)去
使用這段宏定義他可以虛擬新建一個(gè)與名字category 相同.h.m 讓編譯器 編譯通過
但是每次要對(duì)所有category 都要申明這個(gè)的話可能會(huì)比較麻煩,直接加-all_load 據(jù)官方文檔說,它可以使生成的可執(zhí)行文件較大,并且產(chǎn)生一些不需要的文件
#ifndef YYSYNTH_DYNAMIC_PROPERTY_OBJECT
#define YYSYNTH_DYNAMIC_PROPERTY_OBJECT(_getter_, _setter_, _association_, _type_) \
- (void)_setter_ : (_type_)object { \
[self willChangeValueForKey:@#_getter_]; \
objc_setAssociatedObject(self, _cmd, object, OBJC_ASSOCIATION_ ## _association_); \
[self didChangeValueForKey:@#_getter_]; \
} \
- (_type_)_getter_ { \
return objc_getAssociatedObject(self, @selector(_setter_:)); \
}
#endif
//調(diào)用的方法
@interface NSObject (MyAdd)
@property (nonatomic, retain) UIColor *myColor;
@end
#import <objc/runtime.h>
@implementation NSObject (MyAdd)
YYSYNTH_DYNAMIC_PROPERTY_OBJECT(myColor, setMyColor, RETAIN, UIColor *)
@end
使用runtime 運(yùn)行時(shí)屬性 給catetory 動(dòng)態(tài)添加屬性