美文网首页
NSObject的isa和superclass区别

NSObject的isa和superclass区别

作者: GDCoder | 来源:发表于2021-03-10 13:51 被阅读0次

这篇博客介绍的就是网上很流行的一张图关于isa和superclass的关系的解释!

温馨提示:如果你没有接触类的对象不了解的话,这篇博客有点费解,建议先看一下深入探究NSObject对象

一、isa

首先看下面的代码

@interfance GDStudent : GDPerson

@interfance GDPerson : NSObject

我们知道GDStudent的class的内存中存储的有:isa、superclass、对象方法、属性、协议、成员变量 等等。

我们知道GDPerson的class的内存中存储的有:isa、superclass、对象方法、属性、协议、成员变量 等等。

我们知道NSObject的class的内存中存储的有:isa、superclass、对象方法、属性、协议、成员变量 等等。

好,现在我们写一个代码:

     GDPerson*person = [[GDPersonalloc]init];

     [person  personInstanceMethod];

首先person是实例对象,我们知道是在实例对象的内存里面,而personInstanceMethod的对象方法是在person的class里面,所以我们猜测,实例对象和类对象肯定有某种关联,不然实例对象不可能找到类对象的对象方法。

常见面试题

对象的isa指针指向哪里?

对象的isa指针是指向类对象,类对象的isa指针是指向元类对象。从第一张图的虚线也是很容易看出来。

二、superclass

superclass翻译就是父类的意思,是不是已经思考它的用处了哈,

比如我现在定义一个main的分类,在分类里面写

+(void)test;方法,然后在.m文件实现这个方法。

        GDStudet*stu = [[GDStudetalloc]init];

        [stu test];

上面这段代码,它的实质是怎么运行的,我们分析一下,test肯定是NSObject的类方法,而GDStudet是继承于GDPerson,GDPerson是继承NSObject,而类方法是存在NSObject元类对象内存里面,所以很容易得出下面的结论:

stu首先是通过isa指针找到stu的class对象内存,然后通过stu的class对象的isa指针找到stu的meta-class元类对象,在stu的meta-class元类对象内存中找test类方法,找不到以后通过stu的meta-class元类对象的superclass找到person的meta-class元类对象,然后在person的meta-class元类对象内存中找test,然后还是找不到,最后就是通过person的meta-class元类对象的superclass找到NSObject的meta-class元类对象,然后再去找test方法,最后就找到了实现。

假如test在.m文件没有实现的话,其实也能运行成功,就会报经典得错误:

terminating with uncaught exception of type NSException

拓展

红线圈里面是怎么回事呢?

首先我们可以这样操作在分类里面写

+(void)test;方法,然后在.m文件这样实现-(void)test{ }。

        [GDStudet test];

然后运行,结果发现是正常运行的,并且也调用了-(void)test{ }方法,这里就可以看出meta class是会找到class内存中找test方法,实际上,runtime发消息机制类似这样

 [GDStudet test];类似 objc_msgSend([GDStudet class], @selector(test)),

这里可以看出它是没有区分+和-号方法,所以能调用到-(void)test{ }。实现,

到这里我们很容易看出对象方法和类方法的调用实质!代码就少,就不上传了!

如果觉得我写得对你有所帮助,请关注我,我会持续更新😄

相关文章

  • NSObject的isa和superclass区别

    这篇博客介绍的就是网上很流行的一张图关于isa和superclass的关系的解释! 温馨提示:如果你没有接触类的对...

  • iOS-面试题1-NSObject本质

    目录: NSObject本质 OC对象的分类 isa指针和superclass指针+窥探Class KVO和KVC...

  • NSObject底层实现

    NSObject的实现(OC2.0) 对于实例对象、类对象、元类对象 isa和superclass的关系还得看这张...

  • iOS-浅谈OC中isa和superclass的指针指向

    目录 isa指针----isa指针指向superclass指针----class对象的superclass指针--...

  • 笔记 - isa和superclass

    isa的调用 class的superclass meta-class的superclass 总结1 总结2 isa...

  • iOS:isa与superclass

    目录一,对象的三种类型二,对象的存储信息三,isa指针四,superclass指针五,isa和superclass...

  • isa和superclass

    isa指针 将Objective-c代码转换成 C\C++的代码 找到[person personInstance...

  • isa和SuperClass

    开局一张图 刚开始看这图时,我也是懵的 其实也很好理解,这得分开看 虚线 实线 根类、基类 一般都是指:NSObj...

  • isa和superClass

    isa 对象的isa指针是指向哪里的? instance的 isa 指向 class当调用对象方法时,通过inst...

  • isa和superclass

    D、题:对象的isa指针指向哪里? 拓展: class对象的superclass指针指向哪里? meta-clas...

网友评论

      本文标题:NSObject的isa和superclass区别

      本文链接:https://www.haomeiwen.com/subject/vcaiqltx.html