類的結(jié)構(gòu)分析

關(guān)于類首先我們都知道我們再創(chuàng)建一個類的時候都會繼承與NSObject,那么NSObject中是怎么實現(xiàn)的。我們創(chuàng)建的類和NSObject之間是不是還有其他的東西存在?本文就對此進行一些簡單的探索。

類 元類 根元類

·類 類實際上就是一個對象。

·元類 什么是元類?例如LYHPerson類也是一個對象。那么他肯定是有一個類實例化得到的,這個類就是元類。

·根元類 根元類 就是元類實例化得到的。也就是我們所說的NSObject。

探索過程如圖所示:

首先我們打印出一個類的x/4gx一個類,可以打印出這個類的內(nèi)存地址的情況。我們拿到首地址(即類的指針地址),&MASK得出?0x00000001000022e8 這個地址。我們打印這個地址就能得出當(dāng)前這個類的類名。

然后我們繼續(xù)對 這個地址進行x/4gx 我們就能得出一個新的內(nèi)存地址的情況,然后用同樣的方法 有打印出了一個LYHPerson 0x00000001000022c0。那么這個LYHPerson就是元類。

我們繼續(xù)進行操作就能得出0x00000001003340f0 這樣一個地址。打印這個地址就能得出NSObject。就證明了NSObject是LYHPerson的根元類。

繼承

如果此時我們繼承LYHPerson創(chuàng)建一個LYHTeacher,LYHPerson *person;LYHTeacher *teacher,此時person和teacher是沒有關(guān)系的。只有LYHPerson和LYHTeacher是存在繼承關(guān)系。那么此時的繼承關(guān)系就是LYHTeacher繼承于LYHPerson,LYHPerson又繼承于NSObject,NSObject繼承于nil。為什么NSObject繼承于nil呢。是因為NSObject就是類的基礎(chǔ),是一個從無到有的過程。


了解了類的整個過程之后 上圖我們就能知道上圖的整個流程。

類的分析

對于類的分析 首先我們看一張源碼的截圖,如圖所示

圖中objc_object 和 objc_class是什么呢?objc_object是我們創(chuàng)建所有對象的根對象,而objc_class是繼承于objc_object的,而objc_class包含了我們創(chuàng)建對象的所有信息。怎么印證呢?

首先我們再LYHPerson里面創(chuàng)建一個屬性 name如圖:

然后我們通過對地址的訪問一步步的獲取到內(nèi)容。具體操作如圖所示

通過這兩張圖,最后通過打印*$8我們就得到了LYHPerson中的name屬性。這就印證了objc_class里面儲存了 我們創(chuàng)建的類的所有信息這句話。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容