【iOS】類的本質與isa指標
- 類本身也是一個物件,是class型別的物件.
objc_class結構體的定義:
假設我們建立一個Person類:
建立p物件:Person * p = [Person new] ;
在建立一個物件p之前,在堆記憶體中就先存在了一個該類(Person)的型別物件(類物件),類物件在編繹時系統會為我們自動建立。
建立一個物件之後,在堆記憶體中會建立了一個p物件,該物件包含了一個isa指標的成員變數(第一個屬性),isa指標則指向在堆裡面存在的類物件, 在棧記憶體裡建立了一個該類的指標p,p指標指向的是isa地址,isa指向Person.
圖1所示,Class是一個指向objc_class(類)結構體的指標,而id是一個指向objc_object(物件)結構體的指標。objec_object(物件)中isa指標指向的類結構稱為objec_class(該物件的類),其中存放著普通成員變數與物件方法 (“-”開頭的方法)。objec_class(類)中isa指標指向的類結構稱為metaclass(該類的元類),其中存放著static型別的成員變數與static型別的方法 (“+”開頭的方法)。
類物件(class object)
- 類物件的實質由編譯器建立的,即在編譯時所謂的類,就是指類物件(官方文件中是這樣說的: The class object is the compiled version of the class)。任何直接或間接繼承了NSObject的類,它的例項物件(instance objec)中都有一個isa指標,指向它的類物件(class object)。這個類物件(class object)中儲存了關於這個例項物件(instace object)所屬的類的定義的一切:包括變數,方法,遵守的協議等等。因此,類物件能訪問所有關於這個類的資訊,利用這些資訊可以產生一個新的例項,但是類物件不能訪問任何例項物件的內容。當你呼叫一個 “類方法” 例如 [NSObject alloc],你事實上是傳送了一個訊息給他的類物件。
- 類物件和例項物件是有很大區別的,儘管類物件保留了一個類例項的原型,但它並不是例項本身。它沒有自己的例項變數,也不能執行類的例項的方法(只有例項物件才可以執行例項方法)。另外例項(-號)方法在類物件中,類物件從父類那裡繼承類方法,就像例項從父類那裡繼承例項方法一樣。
- 類物件是一個功能完整的物件,所以也能被動態識別(dynamically typed),接收訊息,從其他類繼承方法。特殊之處在於它們是由編譯器建立的,缺少它們自己的資料結構(例項變數),只是在執行時產生例項的代理。
元類物件(metaclass object)
- 元類物件的實質:類物件是元類物件的一個例項!!元類描述了 一個類物件,就像類物件描述了普通物件一樣。不同的是元類的方法列表是類方法的集合,由類物件的選擇器來響應。當向一個類傳送訊息時,objc_msgSend會通過類物件的isa指標定位到元類,並檢查元類的方法列表(包括父類)來決定呼叫哪個方法。元類代替了類物件描述了類方法,就像類物件代替了例項物件描述了例項化方法。
很顯然,元類也是物件,也應該是其他類的例項,實際上元類是根元類(root class’s metaclass)的例項,而根元類是其自身的例項,即根元類的isa指標指向自身。
類的super_class指向其父類,而元類的super_class則指向父類的元類。元類的super class鏈與類的super class鏈平行,所以類方法的繼承與例項方法的繼承也是並行的。而根元類(root class’s metaclass)的super_class指向根類(root class),這樣,整個指標鏈就連結起來了!!
這裡的,類物件是元類物件的一個例項,元類也是物件,也應該是其他類的例項
用官方的圖示簡單的標識就是如下:
如有錯誤,希望一起探討交流!
相關文章
- isa指標指標
- iOS 瞭解isa-swizzling (類指標交換)iOS指標
- OC的isa指標指標
- IOS 底層原理 類的本質--(2)iOS
- OC指標的本質指標
- 【C++】 61_智慧指標類别範本C++指標
- 基類指標,子類指標,虛擬函式,override與final指標函式IDE
- 評估指標與評分(上):二分類指標指標
- Objective-C 類的本質Object
- 聊聊C語言和指標的本質C語言指標
- ARC中強指標與弱指標指標
- 控制指標與統計指標指標
- IOS 底層原理 物件的本質--(1)iOS物件
- 指標陣列與陣列指標指標陣列
- 【C進階】26、指標的本質分析指標
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標
- 反映資料質量的八個指標指標
- 指標與引用指標
- 用 isa 承載物件的類資訊物件
- iOS開發·runtime原理與實踐: 基本知識篇(類,超類,元類,super_class,isa,物件,方法,SEL,IMP)iOS物件
- iOS底層原理總結 - Category的本質iOSGo
- iOS-block本質是什麼?iOSBloC
- iOS底層原理 - Block本質探究iOSBloC
- c++ 類的函式引用 指標C++函式指標
- iOS野指標定位總結iOS指標
- iOS指標學習筆記iOS指標筆記
- 技術的本質與啟示
- C與指標 第六章 指標指標
- C++ 類成員指標C++指標
- 日趨成熟的視訊質量度量指標指標
- 指標與const指標
- 指標與字串排序指標字串排序
- 型別的本質:對變數、型別、指標的理解型別變數指標
- runtime執行時 isa指標 SEL方法選擇器 IMP函式指標 Method方法 runtime訊息機制 runtime的使用指標函式
- runtime(零) Objc 中類和物件的本質OBJ物件
- 分類演算法的評估指標演算法指標
- 類成員的指標 classname::*member, (classname::*pf)()指標
- 第 10 節:複合型別-5. 指標 -- 指標與指標變數 -8. 多級指標型別指標變數