【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.创建Worker实例对象,调用eat对象方法

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

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

假设Worker有eat方法,那么会

  1. 通过worker实例的isa找到worker的class
  2. 在class的方法列表里面找,因为worker有eat方法,所以找到了,调用

note: 即使父类有eat方法也只会调用worker自身的

worker eat

假设Worker没有eat方法,Person里面有

  1. 那么会通过worker的isa找到worker的class对象
  2. 在class对象的方法列表里面找,因为worker没有eat方法,找不到
  3. 通过worker的class对象的superclass找到Person的class对象
  4. 在Person的class对象的方法列表里面找,因Person有,找到了,调用

面试复习笔记:

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的iOS开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
——点击加入:iOS开发交流群就可以免费领取

person eat

假设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对象的方法列表中找,找到了,调用

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方法

  1. 通过worker的class对象的isa找到worker的meta-class
  2. 在meta-class的方法列表中找,找到,调用

worker drink Worker

假设worker没有,person有

  1. 通过worker的class对象的isa找到worker的meta-class
  2. 在meta-class的方法列表中找,找不到
  3. 通过worker的meta-class对象的superclass找到person的meta-class对象
  4. 在person的meta-class对象的方法列表中找,找到,调用

person drink Worker

假设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对象的方法列表中找,找到,调用

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指向自己,换成具体的例子就是

  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

推荐👇:

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:891488181 ,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

申请即送:

  • ——点击加入:iOS开发交流群

  • BAT大厂面试题、独家面试工具包,

  • 资料免费领取,包括 数据结构、底层进阶、图形视觉、音视频、架构设计、逆向安防、RxSwift、flutter,

文章到这里就结束了,你也可以私信我及时获取最新资料。如果你有什么意见和建议欢迎给我留言。想要学习的就来,不想的..........那就算了吧,反正白嫖的你都不要。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容