【iOS】徹底搞懂isa和superclass的作用

實例對象,類對象,元類對象的isa指向

instance的isa指向class
class的isa指向meta-class
meta-clas的isa指向基類的meta-class

類對象,元類對象的superclass指向

class的superclass指向父類的class
如果沒有superclass則指向nil
meta-class的superclass指向父類的meta-class

特殊: 基類的meta-class的superclass指向基類的class

isa和superclass的作用

實例對象的isa和superclass的作用

eg,比如有對象Worker,繼承自Person,Person繼承自NSObject.創(chuàng)建Worker實例對象,調(diào)用eat對象方法

    Worker *w = [[Worker alloc]init];
    [w eat];

//    eat方法
    - (void)eat{
        NSLog(@"person eat %@",self);
    }

假設(shè)Worker有eat方法,那么會

  1. 通過worker實例的isa找到worker的class
  2. 在class的方法列表里面找,因為worker有eat方法,所以找到了,調(diào)用

note: 即使父類有eat方法也只會調(diào)用worker自身的

worker eat

假設(shè)Worker沒有eat方法,Person里面有

  1. 那么會通過worker的isa找到worker的class對象
  2. 在class對象的方法列表里面找,因為worker沒有eat方法,找不到
  3. 通過worker的class對象的superclass找到Person的class對象
  4. 在Person的class對象的方法列表里面找,因Person有,找到了,調(diào)用

面試復(fù)習(xí)筆記:

這份資料我從春招開始,就會將各博客、論壇。網(wǎng)站上等優(yōu)質(zhì)的iOS開發(fā)中高級面試題收集起來,然后全網(wǎng)尋找最優(yōu)的解答方案。每一道面試題都是百分百的大廠面經(jīng)真題+最優(yōu)解答。包知識脈絡(luò) + 諸多細(xì)節(jié)。
節(jié)省大家在網(wǎng)上搜索資料的時間來學(xué)習(xí),也可以分享給身邊好友一起學(xué)習(xí)。
——點擊加入:iOS開發(fā)交流群就可以免費領(lǐng)取

person eat

假設(shè)worker沒有,person也沒有,NSObject的分類里面有

  1. 那么會通過worker的isa找到worker的class對象
  2. 在class對象的方法列表里面找,因為worker沒有eat方法,找不到
  3. 通過worker的class對象的superclass找到Person的class對象
  4. 在Person的class對象的方法列表里面找,因Person有,找不到
  5. 通過Person的class對象的superclass找到NSObject的class對象
  6. 在NSObject的class對象的方法列表中找,找到了,調(diào)用

NSObject eat

可以發(fā)現(xiàn),調(diào)用者始終是worker

如果NSObject里面也沒有,那么就會報錯

-[Worker eat]: unrecognized selector sent to instance 0x600000008910

類對象的isa和superclass的作用

原理同上
只不過用類對象的isa找到的是meta-class,通過superclass找到的是父類的meta-class,另外這次我們調(diào)用的是class方法

[Worker drink];

// drink的實現(xiàn)如下
+ (void)drink{
    NSLog(@"worker drink %@",self);
}

假設(shè)worker有drink方法

  1. 通過worker的class對象的isa找到worker的meta-class
  2. 在meta-class的方法列表中找,找到,調(diào)用

worker drink Worker

假設(shè)worker沒有,person有

  1. 通過worker的class對象的isa找到worker的meta-class
  2. 在meta-class的方法列表中找,找不到
  3. 通過worker的meta-class對象的superclass找到person的meta-class對象
  4. 在person的meta-class對象的方法列表中找,找到,調(diào)用

person drink Worker

假設(shè)worker沒有,person沒有,NSObject的分類有

  1. 通過worker的class對象的isa找到worker的meta-class
  2. 在meta-class的方法列表中找,找不到
  3. 通過worker的meta-class對象的superclass找到person的meta-class對象
  4. 在person的meta-class對象的方法列表中找,找不到
  5. 通過person的meta-class對象的superclass找到NSObject的meta-class對象
  6. 在NSObject的meta-class對象的方法列表中找,找到,調(diào)用

NSObject drink Worker

假設(shè)worker沒有,person沒有,NSObject的分類也沒有

按照我們前面說的,類方法只存在于meta-class中,調(diào)用worker的類方法,會依次找worker,person,NSObject的meta-class,那假如連NSObject的meta-class也沒有,正常來想應(yīng)該會報錯,讓我們注釋掉NSObject里面的drink實現(xiàn),果然報錯

+[Worker drink]: unrecognized selector sent to class 0x100002d50

假設(shè)worker沒有,person沒有,NSObject的分類也沒有,但是NSObject卻有一個名為drink的對象方法呢?

按照我們前面說的,類方法只存在于meta-class中,調(diào)用worker的類方法,會依次找worker,person,NSObject的meta-class,那假如連NSObject的meta-class也沒有,NSObject卻有一個名為drink的對象方法會發(fā)生什么呢?答案是會調(diào)用這個名為drink的對象方法

//NSObject的對象方法drink
- (void)drink{
    NSLog(@"對象方法 NSObject drink %@",self);
}

對象方法 NSObject drink Worker

果然打印了對象方法,這簡直是太出人意料了,調(diào)用類方法最后卻調(diào)用了對象方法,這是為什么呢?這也是官方示意圖中root class的meta的superclass指向了自身的class對象的結(jié)果

meta的isa和superclass

meta-class的isa都指向根對象的meta-class,根對象的meta-class的isa指向自己,換成具體的例子就是

  1. worker的meta-class的isa指向NSObject的meta-class
  2. person的meta-class的isa指向NSObject的meta-class
  3. NSObject的meta-class的isa指向NSObject的meta-class

meta-class的superclass指向

  1. worker的meta-class的superclass指向person的meta-class
  2. person的meta-class的superclass指向NSObject的meta-class
  3. NSObject的meta-class的superclass指向NSObject的class

推薦??:

作為一個開發(fā)者,有一個學(xué)習(xí)的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:891488181 ,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經(jīng)驗,討論技術(shù), 大家一起交流學(xué)習(xí)成長!

申請即送:

  • ——點擊加入:iOS開發(fā)交流群

  • BAT大廠面試題、獨家面試工具包,

  • 資料免費領(lǐng)取,包括 數(shù)據(jù)結(jié)構(gòu)、底層進(jìn)階、圖形視覺、音視頻、架構(gòu)設(shè)計、逆向安防、RxSwift、flutter,

文章到這里就結(jié)束了,你也可以私信我及時獲取最新資料。如果你有什么意見和建議歡迎給我留言。想要學(xué)習(xí)的就來,不想的..........那就算了吧,反正白嫖的你都不要。

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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