淺析YYKit(base 篇)之頭文件解析 1

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


EA102D35-DD95-4EFA-8098-325B855E8CE7.png

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

09ECF4C2-6F37-40F8-BCBB-EEAD1AE9C19F.png

展開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)添加屬性

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

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

  • http://blog.csdn.net/u013059266/article/details/46998703 ...
    狼之獨(dú)步閱讀 877評(píng)論 0 1
  • 1.項(xiàng)目經(jīng)驗(yàn) 2.基礎(chǔ)問題 3.指南認(rèn)識(shí) 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    扶光啟玄閱讀 5,214評(píng)論 0 13
  • 概述:聲明是將一個(gè)名稱引入一個(gè)程序.定義提供了一個(gè)實(shí)體在程序中的唯一描述.聲明在單個(gè)作用域內(nèi)可以重復(fù)多次(類成員除...
    抓兔子的貓閱讀 705評(píng)論 0 3
  • 六一兒童節(jié) 今天是女兒的節(jié)日,她為這個(gè)節(jié)日付出了太多,每天高強(qiáng)度的練習(xí)至少四個(gè)小時(shí),但她從來沒說過苦,反而很享受這...
    鳴鷗閱讀 375評(píng)論 0 2
  • ~~某一天晚上,我和幾個(gè)朋友在路邊的燒烤攤吃飯聊天,酒至酣時(shí),有人在靜寂中拋出一句,成都的酒醉人。我們吃驚的望著眼...
    黑米洲閱讀 458評(píng)論 0 0

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