關(guān)于類首先我們都知道我們?cè)賱?chuàng)建一個(gè)類的時(shí)候都會(huì)繼承與NSObject刨啸,那么NSObject中是怎么實(shí)現(xiàn)的缀去。我們創(chuàng)建的類和NSObject之間是不是還有其他的東西存在侣灶?本文就對(duì)此進(jìn)行一些簡(jiǎn)單的探索。
類 元類 根元類
·類 類實(shí)際上就是一個(gè)對(duì)象缕碎。
·元類 什么是元類褥影?例如LYHPerson類也是一個(gè)對(duì)象。那么他肯定是有一個(gè)類實(shí)例化得到的咏雌,這個(gè)類就是元類凡怎。
·根元類 根元類 就是元類實(shí)例化得到的。也就是我們所說(shuō)的NSObject赊抖。
探索過(guò)程如圖所示:
首先我們打印出一個(gè)類的x/4gx一個(gè)類统倒,可以打印出這個(gè)類的內(nèi)存地址的情況。我們拿到首地址(即類的指針地址)氛雪,&MASK得出?0x00000001000022e8 這個(gè)地址房匆。我們打印這個(gè)地址就能得出當(dāng)前這個(gè)類的類名。
然后我們繼續(xù)對(duì) 這個(gè)地址進(jìn)行x/4gx 我們就能得出一個(gè)新的內(nèi)存地址的情況报亩,然后用同樣的方法 有打印出了一個(gè)LYHPerson 0x00000001000022c0浴鸿。那么這個(gè)LYHPerson就是元類。
我們繼續(xù)進(jìn)行操作就能得出0x00000001003340f0 這樣一個(gè)地址弦追。打印這個(gè)地址就能得出NSObject岳链。就證明了NSObject是LYHPerson的根元類。
繼承
如果此時(shí)我們繼承LYHPerson創(chuàng)建一個(gè)LYHTeacher劲件,LYHPerson *person宠页;LYHTeacher *teacher左胞,此時(shí)person和teacher是沒(méi)有關(guān)系的。只有LYHPerson和LYHTeacher是存在繼承關(guān)系举户。那么此時(shí)的繼承關(guān)系就是LYHTeacher繼承于LYHPerson,LYHPerson又繼承于NSObject遍烦,NSObject繼承于nil俭嘁。為什么NSObject繼承于nil呢。是因?yàn)镹SObject就是類的基礎(chǔ)服猪,是一個(gè)從無(wú)到有的過(guò)程供填。
了解了類的整個(gè)過(guò)程之后 上圖我們就能知道上圖的整個(gè)流程。
類的分析
對(duì)于類的分析 首先我們看一張?jiān)创a的截圖罢猪,如圖所示
圖中objc_object 和 objc_class是什么呢近她?objc_object是我們創(chuàng)建所有對(duì)象的根對(duì)象,而objc_class是繼承于objc_object的膳帕,而objc_class包含了我們創(chuàng)建對(duì)象的所有信息粘捎。怎么印證呢?
首先我們?cè)貺YHPerson里面創(chuàng)建一個(gè)屬性 name如圖:
然后我們通過(guò)對(duì)地址的訪問(wèn)一步步的獲取到內(nèi)容危彩。具體操作如圖所示
通過(guò)這兩張圖攒磨,最后通過(guò)打印*$8我們就得到了LYHPerson中的name屬性。這就印證了objc_class里面儲(chǔ)存了 我們創(chuàng)建的類的所有信息這句話汤徽。