本篇文章采用的源碼是objc4-781版本
class_ro_t
class_ro_t
存儲了當前類在編譯期就已經(jīng)確定的屬性
、方法
以及遵循的協(xié)議
,里面是沒有分類的方法
的梗劫。那些運行時添加的方法將會存儲在運行時
生成的class_rw_t
中。
ro
即表示read only
,是無法進行修改的陵像。
class_rw_t
ObjC
類中的屬性
、方法
還有遵循的協(xié)議
等信息都保存在 class_rw_t
中
class_rw_t生成時機
class_rw_t
生成在運行時寇壳,在編譯期間醒颖,class_ro_t
結構體就已經(jīng)確定,objc_class
中的bits
的data部分存放著該結構體的地址壳炎。在runtime
運行之后泞歉,具體說來是在運行runtime
的realizeClass
方法時,會生成class_rw_t
結構體匿辩,該結構體包含了class_ro_t
腰耙,并且更新data部分,換成class_rw_t
結構體的地址铲球。
類的realizeClass
運行之前:
類的realizeClass
運行之后:
細看兩個結構體的成員變量會發(fā)現(xiàn)很多相同的地方沟优,他們都存放著當前類的屬性、實例變量睬辐、方法挠阁、協(xié)議等等。區(qū)別在于:class_ro_t
存放的是編譯期間就確定的溯饵;而class_rw_t
是在runtime時才確定侵俗,它會先將class_ro_t
的內(nèi)容拷貝過去,然后再將當前類的分類的這些屬性丰刊、方法等拷貝到其中隘谣。所以可以說class_rw_t
是class_ro_t
的超集,當然實際訪問類的方法、屬性等也都是訪問的class_rw_t
中的內(nèi)容