Objective-C isa 指针

在OC中任何类的定义都是对象,类和类的实例(对象)没有任何本质上的区别。任何对象都有isa指针。
那么什么是类呢?在Xcode中用快捷键Shift+Command+O 打开文件objc.h 能看到类的定义:Class的源码
从图中可以看出:
Class 是一个objc_class结构类型的指针
id 是一个objc_object结构类型的指针

下面我再来看下objc_class

objc_class的描述
各个参数的含义:
isa:是一个Class类型的指针,每个实例对象都有一个isa指针,指向对象的类;Class里也有一个isa指针,指向元类(MetaClass)。元类也是类,也是对象,也有isa指针,其isa指针最终都指向一个根元类(Root MetaClass)。根元类的isa指针指向自身,这样就形成了一个封闭的内循环。当类方法被调用时,会先从本身查找类方法的实现,如果没有,元类会向其父类查找该方法。

这里讲述一下对象、类对象、元类对象的概念
1.类对象存储实例方法列表等信息
2.元类对象是存储类方法列表等信息

super_class:父类,如果该类已经是最顶层的根类,那么它为NULL。
version:类的版本信息
info:供运行期使用的一些位标识。
instance_size:该类的实例变量大小
ivars:成员变量数组
methodLists 方法列表
cache 调用过得方法的缓存
protocols 要遵守的协议列表

MetaClass 的 super_class 指向父 MetaClass,如果该 MetaClass 是根MetaClass则指向该 MetaClass 对应的类;
------------------------------------重点 ------------------------------------
由此演变的一道面试题
问题:如果类方法没有实现,但是有同名的实例方法实现,会发生崩溃还是会实现?
答:会实现,因为根元类的super_class 最终会指向对应的类对象,也就是说在元类对象中找不到类方法时,会去类对象中查找。


各个类实例变量的继承关系,如图所示:


每一个对象本质上都是一个类的实例。其中类定义了成员变量和成员方法的列表。对象通过对象的isa指针指向类。

每一个类本质上都是一个对象,类其实是元类(MetaClass)的实例。元类定义了类方法的列表。类通过类的isa指针指向元类。

所有的元类最终继承一个根元类,根元类isa指针指向本身,形成一个封闭的内循环。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值