isa、class、meta-class白话总结

14 篇文章 0 订阅

之前看过不少关于runtime的相关文章,其中对于isa、class、meta-class概念的描述都是比较抽象、晦涩的,虽然理解这些概念在实践中不一定能用的上,但既然学习了runtime,还是应该尽可能的把这些相关概念弄明白,下面,用我自己不太严谨的白话,粗略总结梳理一下我对这部分的理解与体会。

对象与类,面向对象编程中最基本的概念,对象就是具体的实例,类则是一个抽象的概念。而在OC中类则不仅仅是一个抽象概念,其也是通过具体结构体(Class结构体)进行描述的,也可实例化为一个对象的(Class对象!).

每个具体的对象(coder1)内都有isa指针,isa指针指向这个对象所属类(Coder)对应的Class对象(coder1_class),好绕啊.....,画图


coder1是一个Coder类的具体对象,而Coder类本身是通过Class结构体进行描述的,所以也可以实例出一个具体的Class对象coder1_class.

coder1_class对象是对coder1对象底层的具体描述,其中ivars是成员列表指针,methodLists是方法列表指针,cache是方法调用缓存,protocols则是协议列表指针。super_class则指向了Coder父类(Person)的Class对象(person_class),这样就把类的继承关系串联起来了。如图


当我们去访问或调用coder1对象的属性或方法时,都会通过isa指针去找到其对应的coder1_class对象,通过里面的ivars、methodList等指针,找到需要访问或调用的具体属性与方法,如果在coder1_class中没有找到,则通过coder1_class中的super_class去继续往父类class对象中寻找,直到找到或到object_class(NSObject对象的class)为止.

上面介绍了实例对象中的isa指针,及class对象中super_class的作用,但实际上,每个class对象中,也有一个isa指针,这个指针指向的是每个class对象对应的元类(Meta-Class)对象。

元类是啥?为什么要引入元类?开篇时,我们提到了面相对象编程中最基本的概念对象(实例)与类,现在再提一对基本概念,实例方法与类方法.前文我们描述了访问和调用coder1对象的属性或方法时的流程,其实就是访问实例方法的流程,而如果访问的不是实例方法,而是类方法,则需要借助元类了。当你调用实例方法时,都是在Class对象中去寻找的;而当你访问类方法时,则都是在Class对应的Meta-Class中寻找的。

元类里存储了每个类的所有类方法,每个类都会唯一对应一个元类(ios现在也引入了类属(性)的概念,个人感觉应该也是在元类中存储的吧).

如图,Class对象中的isa指针指向的是每个Class对象对应的Meta-Class对象。

Meta-Class对象中也有isa、super_class指针.Meta-Class中的super_class指针指向父Meta-Class对象(NSObject除外,见补充),而Meta-Class中的isa指针,不管它所处的继承层次在哪儿,都指向NSObject的Meta-Class。


这样,isa指针串联起了实例对象、class对象及meta_class对象;superclass则串联起了继承层次关系.属性、方法就可以通过这些路径进行查找访问了。

补充:

NSObject没有父类,Class中的superclass指向nil,Meta-Class中的superclass指回其对应的Class对象。


最后,附上一张经典图例,现在就应该能看懂了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值