runtime的簡析

類和對象

Objective-C語言是一門動態語言,他將不少靜態語言在編譯和連接時期作的事放到了運行時來處理。這種動態語言的優點在於:咱們寫代碼的時候更具靈活性,如咱們能夠把消息轉發給咱們想要的對象,或者隨意交換一個方法的實現等。

這種特性意味着Objective-C不只須要一個編譯器,還須要一個運行時系統來執行編譯的代碼。對於OC來講,這個運行時系統就像一個操做系統同樣:他讓全部的工做能夠正常的運行,這個運行時系統就是Obj Runtime。Obj Runtime其實就是一個Rumtime庫,他基本是用C和OC彙編寫的,這個庫使得C語言有了面向對象的能力。

Runtime庫主要作下面幾件事:

封裝:在這個庫中,對象能夠用C語言中的結構體表示,而方法能夠用C函數來實現,另外再加上了一些額外的特性。這些結構體和函數被runtime函數封裝後,咱們就能夠在程序運行時建立,檢查,修改類、對象和它們的方法了。

找出方法的最終執行代碼:當程序執行[object doSomething]時,會向消息接收者(object)發送一條消息(doSomething),runtime會根據消息接收者是否能響應該消息而作出不一樣的反應。這將在後面詳細介紹。

Objective-C runtime目前有兩個版本:Modern runtime和Legacy runtime。Modern Runtime 覆蓋了64位的Mac OS X Apps,還有 iOS Apps,Legacy Runtime 是早期用來給32位 Mac OS X Apps 用的,也就是能夠不用管就是了。

在這一系列文章中,咱們將介紹runtime的基本工做原理,以及如何利用它讓咱們的程序變得更加靈活。在本文中,咱們先來介紹一下類與對象,這是面向對象的基礎,咱們看看在Runtime中,類是如何實現的。

類與對象基礎數據結構

Class

Objective-C類是由Class類型來表示的,它其實是一個指向objc_class結構體的指針。它的定義以下:

typedef struct objc_class *Class;緩存

查看objc/runtime.h中objc_class結構體的定義以下:

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;
if !__OBJC2__
    Class super_class                       OBJC2_UNAVAILABLE;  // 父類
    const char *name                        OBJC2_UNAVAILABLE;  // 類名
    long version                            OBJC2_UNAVAILABLE;  // 類的版本信息,默認爲0
    long info                               OBJC2_UNAVAILABLE;  // 類信息,供運行期使用的一些位標識
    long instance_size                      OBJC2_UNAVAILABLE;  // 該類的實例變量大小
    struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 該類的成員變量鏈表
    struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定義的鏈表
    struct objc_cache *cache                OBJC2_UNAVAILABLE;  // 方法緩存
    struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 協議鏈表
#endif
} OBJC2_UNAVAILABLE;
相關文章
相關標籤/搜索