yykit 是最近一個很火的開源框架状勤,今天來研究看看yykit源碼和一些原理,剛拿到y(tǒng)ykit還是 很驚訝夕春,來看看yykit 的目錄未荒,功能不僅強大,而且是十分全面的及志,我們來看看他的目錄結(jié)構(gòu)
不得不驚嘆片排,真的好全面,一篇文章根本看不完速侈,今天還是先從base 說起吧率寡,
展開base 也是不少東西,先來看看這個頭文件定義了什么吊炸天的東西
一開始看就尼瑪就卡主了倚搬,
#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語言中沒有該定義捅僵。即這個是用來:識別是c代碼還是c++代碼
在看EXTERN_C ,調(diào)用extern "C"會讓c++編譯器按照c的編譯格式來編譯眨层。多用于c++庫的頭文件庙楚。 也即是說這個在c++的環(huán)境下,會強制編譯器用 C 語言的規(guī)則去編譯趴樱,而不是用 C++ 語言的規(guī)則馒闷。。因為 C++ 為了實現(xiàn)函數(shù)重載會把函數(shù)名和參數(shù)等聯(lián)合起來合成一個中介的函數(shù)名叁征,如果 C 函數(shù)也被這樣編譯會出問題纳账,所以在我看來這個是為了兼容c++環(huán)境不會編譯報錯。
好吧解決了這個 在往下看看有什么比較難理解的東西
接下來是一個兩重判斷的 宏定義
#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
雖然這個一眼就看出來是個交換 函數(shù)還是有兩個地方需要注意的為什么要用這個關(guān)鍵字呢typeof 還有為什么要用do while 直接用if else 不是就行了嗎
百度一下你就知道
typeof(var) 是gcc對C語言的一個擴展保留字捺疼,用于聲明變量類型,var可以是數(shù)據(jù)類型(int疏虫, char*..),也可以是變量表達式。也即是說 變量a 還可以是個變量表達式這里吊吊的
啤呼,但為啥要用do while 這里就請眾大神指點迷津了议薪。
就不一一解析,看一些比較特別的吧
#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 編進去
使用這段宏定義他可以虛擬新建一個與名字category 相同.h.m 讓編譯器 編譯通過
但是每次要對所有category 都要申明這個的話可能會比較麻煩,直接加-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 運行時屬性 給catetory 動態(tài)添加屬性