NSObject的isa和superclass区别

31 篇文章 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{ }。实现,

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

 

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值