isaclassmeta-class白话总结
Posted zhaochen_009
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了isaclassmeta-class白话总结相关的知识,希望对你有一定的参考价值。
之前看过不少关于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对象。
最后,附上一张经典图例,现在就应该能看懂了
以上是关于isaclassmeta-class白话总结的主要内容,如果未能解决你的问题,请参考以下文章