接上篇OC底層原理(二)
平時自己都有學(xué)習(xí)一些底層原理,但是太過分散荣挨,也沒有寫過筆記男韧,這次正好通過mj課程查漏補(bǔ)缺朴摊,也記錄下來。
本節(jié)內(nèi)容也有一道面試題此虑。
問:OC的類信息存放在哪里甚纲?
之前我們已經(jīng)研究過了instance對象、class對象朦前、meta-class對象介杆,及內(nèi)部isa指針。而且我們說class對象和meta-class對象同樣都是objc_class結(jié)構(gòu)體類型韭寸,接下來我們就看下這個結(jié)構(gòu)體內(nèi)部結(jié)構(gòu)春哨。
在objc源碼中,objc/objc-runtime-new.h中objc_class結(jié)構(gòu)體的定義如下:
我們再看下class_rw_t 內(nèi)部:
class_rw_t里面的methods恩伺、properties悲靴、protocols是二維數(shù)組,是可讀可寫的莫其。
以method_array_t為例癞尚,method_array_t本身就是一個數(shù)組,數(shù)組里面存放的是數(shù)組method_list_t乱陡,method_list_t里面最終存放的是method_t浇揩。
class_ro_t是只讀的,存放成員變量信息憨颠,我們在看class_ro_t內(nèi)部:
class_ro_t中的方法列表等胳徽,來源于初始化class的時候方法列表,通過runtime機(jī)制爽彤,會合并到class_rw_t(可讀可寫)中养盗,這里具體以后在runtime內(nèi)容中講。
整體關(guān)系大概和下圖這樣:
驗證的問題我就不做了适篙,大家可以看這篇寫的比較詳細(xì)http://www.reibang.com/p/74db5638f34f
面試題解答
問:OC的類信息存放在哪里往核?
答:成員變量的具體值存放在instance對象。
對象方法嚷节,協(xié)議聂儒,屬性,成員變量信息存放在class對象硫痰。
類方法信息存放在meta-class對象