標籤:
一.isa指標
要認識什麼是isa指標,我們得先明確一點:
在Objective-C中,任何類的定義都是對象。類和類的執行個體(對象)沒有任何本質上的區別。任何對象都有isa指標。
那麼什麼是類呢?在xcode中用快速鍵Shift+Cmd+O 開啟檔案objc.h 能看到類的定義:
可以看出:
Class 是一個 objc_class 結構類型的指標, id是一個 objc_object 結構類型的指標.
我們再來看看 objc_class 的定義:
稍微解釋一下各個參數的意思:
isa:是一個Class 類型的指標. 每個執行個體對象有個isa的指標,他指向對象的類,而Class裡也有個isa的指標, 指向meteClass(元類)。元類儲存了類方法的列表。當類方法被調用時,先會從本身尋找類方法的實現,如果沒有,元類會向他父類尋找該方法。同時注意的是:元類(meteClass)也是類,它也是對象。元類也有isa指標,它的isa指標最終指向的是一個根元類(root meteClass).根元類的isa指標指向本身,這樣形成了一個封閉的內迴圈。
super_class:父類,如果該類已經是最頂層的根類,那麼它為NULL。
version:類的版本資訊,預設為0
info:供運行期使用的一些位標識。
instance_size:該類的執行個體變數大小
ivars:成員變數的數組
再來看看各個類執行個體變數的繼承關係:
每一個對象本質上都是一個類的執行個體。其中類定義了成員變數和成員方法的列表。對象通過對象的isa指標指向類。
每一個類本質上都是一個對象,類其實是元類(meteClass)的執行個體。元類定義了類方法的列表。類通過類的isa指標指向元類。
所有的元類最終繼承一個根元類,根元類isa指標指向本身,形成一個封閉的內迴圈。
二.runtime 機制
runtime:指一個程式在運行(或者在被執行)的狀態。也就是說,當你開啟一個程式使它在電腦上啟動並執行時候,那個程式就是處於運行時刻。在一些程式設計語言中,把某些可以重用的程式或者執行個體打包或者重建成為“運行庫"。這些執行個體可以在它們啟動並執行時候被串連或者被任何程式調用。
objective-c中runtime:是一套比較底層的純C語言API, 屬於1個C語言庫, 包含了很多底層的C語言API。 在我們平時編寫的OC代碼中, 程式運行過程時, 其實最終都是轉成了runtime的C語言代碼。
runtime的應用:
1.動態建立一個類(比如KVO的底層實現)
2.動態地為某個類添加屬性\方法, 修改屬性值\方法
3.遍曆一個類的所有成員變數(屬性)\所有方法
實質上,以上的是通過相關方法來擷取對象或者類的isa指標來實現的。
相關函數
1. 增加
增加函數:class_addMethod
增加執行個體變數:class_addIvar
增加屬性:@dynamic標籤,或者class_addMethod,因為屬性其實就是由getter和setter函數組成
增加Protocol:class_addProtocol (說實話我真不知道動態增加一個protocol有什麼用,-_-!!)
2. 擷取
擷取函數列表及每個函數的資訊(函數指標、函數名等等):class_getClassMethod method_getName ...
擷取屬性列表及每個屬性的資訊:class_copyPropertyList property_getName
擷取類本身的資訊,如類名等:class_getName class_getInstanceSize
擷取變數列表及變數資訊:class_copyIvarList
擷取變數的值
3. 替換
將執行個體替換成另一個類:object_setClass
替換類方法的定義:class_replaceMethod
4.其他常用方法:
交換兩個方法的實現:method_exchangeImplementations.
設定一個方法的實現:method_setImplementation.
文/曲年(簡書作者)
原文連結:http://www.jianshu.com/p/41735c66dccb
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
Objective-C isa 指標 與 runtime 機制