類和對象
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;