iOS 底層探究:類的結構分析

這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰緩存

將實例對象isa進行&運算,可獲得類對象的地址。一樣在OC中,類也是一個對象。既然是對象,也會存在isa指針,指向他所屬的類。這就是咱們所說的元類(MetalClass)。markdown

  • 類也是一個對象,也存在isa指針,指向它所屬的類。即:元類(MetalClass
  • 元類初探:實例對象isa -> 類isa -> 元類
  • 對象的isanonpoionter類型,除了類對象地址,isa中包含類信息,因此&運算後地址不一樣
  • 類的isa爲非nonpointer類型,屬於純isa指針,只存儲類對象的地址,全部&運算後地址相同

1. isa走位&繼承鏈

1.1 isa走位

  • NSObject做爲根類,它的isa指向的元類,稱爲根元類。
  • 根元類的地址和XXClass元類isa指向的地址相同。
  • XXClass的元類isa,指向的並非NSObject,而是根元類(NSObject的元類)。
  • 根元類的isa指向本身。

image.png

  • 實例對象isa -> 類isa -> 元類isa -> 根元類isa -> 本身
  • 根類的實例對象isa -> 根類isa -> 根元類isa -> 本身

1.2 繼承鏈

繼承鏈流程圖數據結構

image.png

  • 繼承關係只來自於類,對象之間沒有這層關係
  • 類和元類都存在繼承鏈
  • 元類的父類是父類的元類
  • 類的繼承鏈:類->父類->根類->nil
  • 元類的繼承鏈:元類->父類的元類->根元類->根類->nil
  • NSObject做爲根類,它纔是真正的萬物之主,全部類都源於NSObject

1.3 官方流程圖

image.png

  • isa走位:實例對象isa ——>類isa ——>元類isa ——>根元類isa ——>本身
  • 類的繼承鏈:類 ——>父類——>根類——>nil
  • 元類的繼承鏈:元類——>父類的元類——>根元類——>根類——>nil

2類的結構

2.1源碼分析

類也是一個對象,有本身的數據結構,而類的底層來自objc_class結構體,可經過源碼分析類的結構,在objc-runtime-new.h中,能夠看到objc_class結構體的定義:源碼分析

struct objc_class : objc_object { 
    objc_class(const objc_class&) = delete; 
    objc_class(objc_class&&) = delete;
    void operator=(const objc_class&) = delete;
    void operator=(objc_class&&) = delete;
    // Class ISA; 
    Class superclass; 
    cache_t cache; // formerly cache pointer and vtable 
    class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
    ... 
};
複製代碼

從上面的源碼定義來看,咱們的類也是一個對象,只是裏面比對象多了幾個成員變量superclass、cache、bits。post

  • superclass :這個就是指向父類的指針。
  • cache(cache_t):經過分析cache_t 的結構,咱們能夠得出cache_t這個佔用的內存空間爲16字節。因此按照內存平移的規則咱們能夠知道class_data_bits_t和類首地址之間的差距是32字節(isa:8字節,superclass:8字節,cache:16字節)
  • bits(class_data_bits_t)

image.png

  • superclass爲結構體指針,存儲父類
  • cache爲cache_t結構體,存儲方法緩存
  • bits爲class_data_bits_t結構體,存儲方法、屬性、協議列表等
相關文章
相關標籤/搜索