
實例對象,類對象,元類對象的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方法,那么會
- 通過worker實例的isa找到worker的class
- 在class的方法列表里面找,因為worker有eat方法,所以找到了,調(diào)用
note: 即使父類有eat方法也只會調(diào)用worker自身的
worker eat
假設(shè)Worker沒有eat方法,Person里面有
- 那么會通過worker的isa找到worker的class對象
- 在class對象的方法列表里面找,因為worker沒有eat方法,找不到
- 通過worker的class對象的superclass找到Person的class對象
- 在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的分類里面有
- 那么會通過worker的isa找到worker的class對象
- 在class對象的方法列表里面找,因為worker沒有eat方法,找不到
- 通過worker的class對象的superclass找到Person的class對象
- 在Person的class對象的方法列表里面找,因Person有,找不到
- 通過Person的class對象的superclass找到NSObject的class對象
- 在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方法
- 通過worker的class對象的isa找到worker的meta-class
- 在meta-class的方法列表中找,找到,調(diào)用
worker drink Worker
假設(shè)worker沒有,person有
- 通過worker的class對象的isa找到worker的meta-class
- 在meta-class的方法列表中找,找不到
- 通過worker的meta-class對象的superclass找到person的meta-class對象
- 在person的meta-class對象的方法列表中找,找到,調(diào)用
person drink Worker
假設(shè)worker沒有,person沒有,NSObject的分類有
- 通過worker的class對象的isa找到worker的meta-class
- 在meta-class的方法列表中找,找不到
- 通過worker的meta-class對象的superclass找到person的meta-class對象
- 在person的meta-class對象的方法列表中找,找不到
- 通過person的meta-class對象的superclass找到NSObject的meta-class對象
- 在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指向自己,換成具體的例子就是
- worker的meta-class的isa指向NSObject的meta-class
- person的meta-class的isa指向NSObject的meta-class
- NSObject的meta-class的isa指向NSObject的meta-class
meta-class的superclass指向
- worker的meta-class的superclass指向person的meta-class
- person的meta-class的superclass指向NSObject的meta-class
- NSObject的meta-class的superclass指向NSObject的class
推薦??:
作為一個開發(fā)者,有一個學(xué)習(xí)的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:891488181 ,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經(jīng)驗,討論技術(shù), 大家一起交流學(xué)習(xí)成長!
申請即送:
BAT大廠面試題、獨家面試工具包,
-
資料免費領(lǐng)取,包括 數(shù)據(jù)結(jié)構(gòu)、底層進(jìn)階、圖形視覺、音視頻、架構(gòu)設(shè)計、逆向安防、RxSwift、flutter,
文章到這里就結(jié)束了,你也可以私信我及時獲取最新資料。如果你有什么意見和建議歡迎給我留言。想要學(xué)習(xí)的就來,不想的..........那就算了吧,反正白嫖的你都不要。
