OC底層原理06-isa流程圖

一浆劲、回顧

上一期OC底層原理05-isa結(jié)構(gòu)分析中,我們?cè)?code>GomuPerson的實(shí)例對(duì)象person的地址中止邮,拿到第一位地址中的isa温技,進(jìn)行逆向推導(dǎo)isa&mask得到GomuPerson

//: 第一步,拿到`person`的內(nèi)存地址
(lldb) x/4gx person
//: 或者
(lldb) p person
(GomuPerson *) $31 = 0x0000000100632a50
(lldb) x/4gx 0x0000000100632a50
//: 兩種方式都能拿到`person`的地址

//: 下面的`0x001d800100002465 `就是我們需要的`isa`
0x100632a50: 0x001d800100002465 0x0000000000000000
0x100632a60: 0x0000000000000000 0x0000000000000000

//: 用`isa` & `mask`
(lldb) p/x 0x001d800100002465 & 0x00007ffffffffff8ULL
//: 得到了`GomuPerson `的16進(jìn)制地址
(unsigned long long) $29 = 0x0000000100002460
//: 得到`GomuPerson `
(lldb) po 0x0000000100002460
GomuPerson

二廊移、isa流程探索

既然我們用x/4gx打印person對(duì)象的地址糕簿,找到isa探入,從而拿到GomuPerson,那我們用x/4gx打印GomuPerson的地址懂诗,它會(huì)有isa嗎蜂嗽?而它的isa又會(huì)拿到什么?

2.1 類的isa的指向

//: 拿到`GomuPerson `的內(nèi)存地址
(lldb) x/4gx 0x0000000100002460
0x100002460: 0x0000000100002438 0x0000000100334140
0x100002470: 0x0000000100632a80 0x0002803400000003

//: `isa` & `mask`
(lldb) p/x 0x0000000100002438 & 0x00007ffffffffff8ULL
(unsigned long long) $32 = 0x0000000100002438

//: 又得到了`GomuPerson`
(lldb) po 0x0000000100002438
GomuPerson
  • 對(duì)象的isa -> (person -> GomuPerson)殃恒,類的isa -> ?(GomuPerson的isa -> GomuPerson )
  • 對(duì)象都有isa植旧,說明類也是對(duì)象
  • OC底層原理01-alloc流程探索中已經(jīng)知道了,類對(duì)象在內(nèi)存中只會(huì)存一份离唐,但是這里po 0x0000000100002438po 0x0000000100002460都能拿到GomuPerson病附,注意這里第二次打印的GomuPerson元類
  • 元類的定義和創(chuàng)建是由編譯器自動(dòng)完成
  • 得出isa的流程 對(duì)象的isa -> 類的isa -> 元類

2.2 元類的isa的指向

//: 拿到`GomuPerson `元類的內(nèi)存地址
(lldb) x/4gx 0x0000000100002438
0x100002438: 0x00000001003340f0 0x00000001003340f0
0x100002448: 0x00000001010045e0 0x0005e03500000007

//: `isa` & `mask`
(lldb) p/x 0x00000001003340f0 & 0x00007ffffffffff8ULL
(unsigned long long) $34 = 0x00000001003340f0

//: 得到`NSObject `
(lldb) po 0x00000001003340f0
NSObject
  • 元類的isa指向了NSObject
  • 得出isa的流程 對(duì)象的isa -> 類的isa -> 元類的isa -> NSObject

2.3 NSObject的isa的指向

//: 拿到`NSObject `的內(nèi)存地址
(lldb) x/4gx 0x00000001003340f0
0x1003340f0: 0x00000001003340f0 0x0000000100334140
0x100334100: 0x0000000101059460 0x0005e03100000007

//: `isa` & `mask`
(lldb) p/x 0x00000001003340f0 & 0x00007ffffffffff8ULL
(unsigned long long) $36 = 0x00000001003340f0

//: 又得到`NSObject `
(lldb) po 0x00000001003340f0
NSObject
  • NSObject又指向了NSObject
  • 兩個(gè)NSObject的地址都是0x00000001003340f0,說明這里的NSObject的isa會(huì)指向自己
  • 得出isa的流程 對(duì)象的isa -> 類的isa -> 元類的isa -> NSObject的isa -> NSObject

2.4 這里的NSObject和系統(tǒng)初始化的NSObject的區(qū)別

//: 獲取系統(tǒng)初始化的`NSObject `的地址
(lldb) p/x NSObject.class
(Class) $43 = 0x0000000100334140 NSObject

//: 拿到系統(tǒng)初始化的`NSObject `的`isa`
(lldb) x/4gx 0x0000000100334140
0x100334140: 0x00000001003340f0 0x0000000000000000
0x100334150: 0x0000000100632d90 0x0001801000000003
  • 系統(tǒng)初始化的NSObjectisa指向了0x00000001003340f0亥鬓,和我們上面獲取到的NSObjcet的地址相同
  • GomuPerson元類的isa指向的NSObject完沪,不是系統(tǒng)的NSObjcet,而是系統(tǒng)的NSObjcet元類嵌戈,即根元類
  • 得出isa的流程 對(duì)象的isa -> 類的isa -> 元類的isa -> 根元類的isa -> 根元類
  • 萬物皆對(duì)象覆积,皆有isa

2.5 打印對(duì)象地址驗(yàn)證流程

// 實(shí)例對(duì)象
GomuPerson *person = [GomuPerson alloc];
// 類
Class class = object_getClass(person);
// 元類
Class metaClass = object_getClass(class);
// 根元類
Class rootMetaClass = object_getClass(metaClass);
// 根根元類
Class rootRootMetaClass = object_getClass(rootMetaClass);
NSLog(@"\n%p 實(shí)例對(duì)象\n%p 類\n%p 元類\n%p 根元類\n%p 根根元類",person,class,metaClass,rootMetaClass,rootRootMetaClass);

//: 輸出
0x10066fe20 實(shí)例對(duì)象
0x100002470 類
0x100002448 元類
0x1003340f0 根元類
0x1003340f0 根根元類

2.6 isa流程圖

9491599893819_.pic_hd.jpg

三、繼承流程圖

  • 實(shí)例對(duì)象沒有繼承關(guān)系熟呛,繼承關(guān)系來自于類
    • GomuBoy繼承于GomuPerson
    • person1宽档,person2GomuPerson的實(shí)例對(duì)象
    • boy1boy2GomuBoy的實(shí)例對(duì)象
    • boy1庵朝,boy2person1雌贱,person2沒有繼承關(guān)系
  • 類和元類才有繼承關(guān)系
  • NSObject繼承于nil
  • 根元類繼承于NSObject
    image.png

四、將isa流程圖偿短,和繼承流程圖結(jié)合得出

isa流程圖.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欣孤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昔逗,更是在濱河造成了極大的恐慌降传,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勾怒,死亡現(xiàn)場(chǎng)離奇詭異婆排,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)笔链,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門段只,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鉴扫,你說我怎么就攤上這事赞枕。” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵炕婶,是天一觀的道長姐赡。 經(jīng)常有香客問我,道長柠掂,這世上最難降的妖魔是什么项滑? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮涯贞,結(jié)果婚禮上枪狂,老公的妹妹穿的比我還像新娘。我一直安慰自己宋渔,他們只是感情好摘完,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傻谁,像睡著了一般孝治。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上审磁,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天谈飒,我揣著相機(jī)與錄音,去河邊找鬼态蒂。 笑死杭措,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钾恢。 我是一名探鬼主播手素,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瘩蚪!你這毒婦竟也來了泉懦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后思喊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邓嘹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了险胰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汹押。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖起便,靈堂內(nèi)的尸體忽然破棺而出棚贾,到底是詐尸還是另有隱情窖维,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布鸟悴,位于F島的核電站陈辱,受9級(jí)特大地震影響奖年,放射性物質(zhì)發(fā)生泄漏细诸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一陋守、第九天 我趴在偏房一處隱蔽的房頂上張望震贵。 院中可真熱鬧,春花似錦水评、人聲如沸猩系。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寇甸。三九已至,卻和暖如春疗涉,著一層夾襖步出監(jiān)牢的瞬間拿霉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工咱扣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绽淘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓闹伪,卻偏偏與公主長得像沪铭,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子偏瓤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容