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 類可以被繼承,而結構則不支援...