類結構中的class rw t與class ro

2021-10-04 02:27:49 字數 2102 閱讀 3132

struct objc_class : objc_object 

......

}

類結構中包含了class_data_bits_t結構,這個結構實際上上是由乙個指標(class_rw_t *)和一些關於類初始化狀態的的標識組成.可以通過

#if !__lp64__

...// data pointer

#define fast_data_mask 0xfffffffcul

...#elif 1

...#define fast_data_mask 0x00007ffffffffff8ul

...#else

...#define fast_data_mask 0x00007ffffffffff8ul

...#endif

class_rw_t* data()

來獲取類結構中的class_rw_t指標.而class_rw_t結構中又包含了乙個constclass_ro_t *型別的指標實現,那麼class_rw_t和class_ro_t這兩個看起來只有乙個字元差距的結構有什麼不一樣呢?

包含基本成員變數的不同

struct class_ro_t
對比發現,class_ro_t結構中與class_rw_t對應的的主要成員變數都使用了base做區分,說明class_ro_t的結構更加貼近類本身的結構,class_rw_t像是類拓展出來的.

struct class_rw_t
在關於類的實現中,幾乎所有引用到class_ro_t變數的地方都是使用了const關鍵字做修飾,更像是乙個靜態不願意被外界修改的屬性;而引用到class_rw_t變數就沒有這樣的限制.

使用objc原始碼進行除錯,在main中建立物件

int main(int argc, const char * ar**) 

}

並在setdata處進行斷點:

struct objc_class : objc_object 

void setdata(class_rw_t *newdata)

......

}

然後會發現如下呼叫:

發現在_read_images之後就呼叫了realizeclasswithoutswift函式:

ro = (const class_ro_t *)cls->data();

if (ro->flags & ro_future) else

而此時ro已經是乙個例項化之後的class_ro_t *指標,所以class_ro_t *是在類編譯時就已經完成初始化賦值且不可被改變的.而class_rw_t結構則是可以通過方法進行修改.例如:

static sel *

addmethods(class cls, const sel *names, const imp *imps, const char **types,

uint32_t count, bool replace, uint32_t *outfailedcount)

else

if (outfailedcount) *outfailedcount = failedcount;

return failednames;

}

所以可以理解為class_ro_t儲存的是類在編譯期就已經確定的特性,而class_rw_t則是提供在執行時進行類延展的能力.

需要注意的是,通過執行時使用

void objc_setassociatedobject(id object, const void *key, id value, objc_associationpolicy policy)
來為物件新增屬性並不是通過class_rw_t來實現的,而是通過全域性維護的hashmap來實現的.

C 中的結構與類

c corner今天發表了bechir bejaoui的一篇文章 what really make difference between structures and classes?關於結構和類的區別其實是老生常談,不過本文總結得較為全面,所以翻譯過來給大家共享。總結起來,兩者共有如下區別 2 據...

C 中的結構與類

c corner 今天發表了bechir bejaoui的一篇文章 what really make difference between structures and classes?總結起來,兩者共有如下區別 2 據第1點可以得出結論,那就是類物件通常用來傳遞大資料,而結構物件則用來傳遞小資料。...

C 中的結構與類

總結起來,兩者共有如下區別 自 1 結構是值型別,類則是引用型別。因此前者是放在棧 stack 裡,後者則僅僅是將引用位址存放在棧裡,而具體的值則存放在堆 heap 裡。如下圖所示 2 據第1點可以得出結論,那就是類物件通常用來傳遞大資料,而結構物件則用來傳遞小資料。3 類可以被繼承,而結構則不支援...