Objective-C 源碼(零):前戲

    趁着最近比較閒,能夠再次研究一下Objective-C的源代碼,順便梳理一下思路,願有更大收穫。app

    Objective-C是一門面向對象的程序設計語言。它的對象模型是基於類來創立的。源碼能夠在蘋果開源的runtime中下載,鏈接是http://opensource.apple.com/tarballs/objc4/ ,本身下載了個objc4-647.tar.gz 版本。函數

    看源碼能學到不少東西,特別是runtime原理,若是想學好,可是又懶的本身看源碼,只是侷限於看大神的博客裏面的一些他們看完源碼以後寫的感悟,收穫是微乎其微的,至少是隻知其一;不知其二,因此,仍是別偷懶,乖乖本身擼一發吧。
spa

    先說一點看OC前須要準備的知識:
設計

    Class:
指針

    能夠看到Class實際上是一種指針類型,即用於指向objc_class結構體。NSObject中定義的方法- (Class)class;用於返回其對應的objc_class結構體指針。code

    SEL
對象

    typedef struct objc_selector *SEL;字符串

    其實它就是個映射到「方法」的C字符串,能夠用Objc編譯器命令@selector()或者Runtime系統的sel_registerName函數來得到一個SEL類型的「方法選擇器」(一般簡稱「選擇子」)。get

    考慮到Xcode對@selector的支持比對sel_registerName的支持更好,因此@selector貌似用得更多一些,但有時候sel_registerName或許更簡潔一些。編譯器

    另外,使用@selector()尋找某個方法的時候,若是方法沒有實現,編譯器會警告,若是使用的是sel_registerName則沒有警告。

    Method:

typedef
 
struct
 objc_method *Method;


    Ivar:

typedef
 
struct
 objc_ivar *Ivar;


    Category:   

typedef
 
struct
 objc_category *Category;


    objc_property_t:

 typedef
 
struct
 objc_property *objc_property_t;

    能夠經過class_copyPropertyList和protocol_copyPropertyList方法來獲取類(Class)和協議(Protocol)中的屬性,獲取屬性以後,還能夠使用property_getName獲取屬性的名字(C字串):這個在一些博客的黑魔法裏面也用到了,就是給category增長成員變量。

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount);
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount);
const char *property_getName(objc_property_t property);










    主要參考博客:http://zhangbuhuai.com/2015/04/26/unstanding-the-Objective-C-Runtime-part1/ 

相關文章
相關標籤/搜索