实例对象,类对象,元类对象的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.创建Worker实例对象,调用eat对象方法
Worker *w = [[Worker alloc]init];
[w eat];
// eat方法
- (void)eat{
NSLog(@"person eat %@",self);
}
假设Worker有eat方法,那么会
- 通过worker实例的isa找到worker的class
- 在class的方法列表里面找,因为worker有eat方法,所以找到了,调用
note: 即使父类有eat方法也只会调用worker自身的
worker eat
假设Worker没有eat方法,Person里面有
- 那么会通过worker的isa找到worker的class对象
- 在class对象的方法列表里面找,因为worker没有eat方法,找不到
- 通过worker的class对象的superclass找到Person的class对象
- 在Person的class对象的方法列表里面找,因Person有,找到了,调用
面试复习笔记:
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的iOS开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
——点击加入:iOS开发交流群就可以免费领取
person eat
假设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对象的方法列表中找,找到了,调用
NSObject eat
可以发现,调用者始终是worker
如果NSObject里面也没有,那么就会报错
-[Worker eat]: unrecognized selector sent to instance 0x600000008910
类对象的isa和superclass的作用
原理同上
只不过用类对象的isa找到的是meta-class,通过superclass找到的是父类的meta-class,另外这次我们调用的是class方法
[Worker drink];
// drink的实现如下
+ (void)drink{
NSLog(@"worker drink %@",self);
}
假设worker有drink方法
- 通过worker的class对象的isa找到worker的meta-class
- 在meta-class的方法列表中找,找到,调用
worker drink Worker
假设worker没有,person有
- 通过worker的class对象的isa找到worker的meta-class
- 在meta-class的方法列表中找,找不到
- 通过worker的meta-class对象的superclass找到person的meta-class对象
- 在person的meta-class对象的方法列表中找,找到,调用
person drink Worker
假设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对象的方法列表中找,找到,调用
NSObject drink Worker
假设worker没有,person没有,NSObject的分类也没有
按照我们前面说的,类方法只存在于meta-class中,调用worker的类方法,会依次找worker,person,NSObject的meta-class,那假如连NSObject的meta-class也没有,正常来想应该会报错,让我们注释掉NSObject里面的drink实现,果然报错
+[Worker drink]: unrecognized selector sent to class 0x100002d50
假设worker没有,person没有,NSObject的分类也没有,但是NSObject却有一个名为drink的对象方法呢?
按照我们前面说的,类方法只存在于meta-class中,调用worker的类方法,会依次找worker,person,NSObject的meta-class,那假如连NSObject的meta-class也没有,NSObject却有一个名为drink的对象方法会发生什么呢?答案是会调用这个名为drink的对象方法
//NSObject的对象方法drink
- (void)drink{
NSLog(@"对象方法 NSObject drink %@",self);
}
对象方法 NSObject drink Worker
果然打印了对象方法,这简直是太出人意料了,调用类方法最后却调用了对象方法,这是为什么呢?这也是官方示意图中root class的meta的superclass指向了自身的class对象的结果
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
推荐👇:
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:891488181 ,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!
申请即送:
-
BAT大厂面试题、独家面试工具包,
-
资料免费领取,包括 数据结构、底层进阶、图形视觉、音视频、架构设计、逆向安防、RxSwift、flutter,
文章到这里就结束了,你也可以私信我及时获取最新资料。如果你有什么意见和建议欢迎给我留言。想要学习的就来,不想的..........那就算了吧,反正白嫖的你都不要。
网友评论