一葱绒、類分析
在我們?nèi)粘J褂弥卸际莿?chuàng)建類都是繼承自NSObject谬以,在底層把我們的類編譯成什么樣子,我們也不是很清楚圆雁,今天我們把項(xiàng)目編譯成c++源碼來(lái)看一看類編譯成什么樣子忍级。
首先我們創(chuàng)建一個(gè)項(xiàng)目,創(chuàng)建一個(gè)類伪朽,并將這個(gè)類用clang指令轉(zhuǎn)換成c++編碼轴咱。
打開(kāi)cpp編碼可以看到lengli這個(gè)類的類型是objc_object。我們看到這個(gè)方法指向的是objc_class烈涮。繼續(xù)搜索我們沒(méi)有看到objc_class的實(shí)現(xiàn)朴肺,所以我們回到源碼繼續(xù)搜索。
在源碼中搜索objc_class跃脊,在objc-runtime-new.h 文件中看到了它的實(shí)現(xiàn)宇挫。
看到這里可以看到objc_class繼承的是objc_object苛吱,這也驗(yàn)證經(jīng)典名句萬(wàn)物皆對(duì)象......酪术。也就是說(shuō)類也是一種對(duì)象。
二翠储、類的結(jié)構(gòu)
從上面的類分析中可以看出來(lái)绘雁,objc_class里面定義了有4個(gè)屬性,剩下的都是實(shí)現(xiàn)援所。
- isa指針
- superclass指針
- cache
- bits
這里isa指針是父類的庐舟,所以這里顯示的是注釋。
2.1isa指針
這里的isa是類與元類關(guān)聯(lián)使用的住拭。具體isa可以看上一篇文章挪略。
2.2superclass指針
superclass指針看名字就可以看出來(lái)是指向父類的历帚。
2.3cache
點(diǎn)進(jìn)去看cache_t結(jié)構(gòu)體,再繼續(xù)點(diǎn)bucket_t杠娱,可以看到MethodCacheIMP這個(gè)屬性挽牢,從字面上看cache這個(gè)應(yīng)該是緩存類方法的,具體操作本篇不在討論摊求。
2.4bits
下面的結(jié)構(gòu)體中可以看到setData方法是給bits的data賦值禽拔,賦值的類型是class_rw_t,點(diǎn)進(jìn)class_tw_t我們看看具體給的是什么內(nèi)容室叉。
來(lái)到class_tw_t我們可以看到里面的存儲(chǔ)量methods睹栖、properties、protocols這些都是我們熟悉的內(nèi)容茧痕。
本章只是針對(duì)類進(jìn)行分析查看類的結(jié)構(gòu)野来,cache、bits將另外分出兩篇文章再做探索踪旷。