2016笔记——Runtime(三)

要深层次了解runtime运行时的机制,就要先了解类和对象的内部结构。

一、从objc.h中找到对object和class的定义:

屏幕快照 2016-04-12 14.54.52.png

由此可见:

第一行的Class,是一个指向objc_class结构体的指针。

第二行中objc_object结构体,其成员isa是一个指向objc_class结构体的指针。

第三行的id,是一个指向objc_object结构体的指针。

二、我们从runtime.h文件中查看objc_object结构体:

屏幕快照 2016-04-12 16.00.59.png

由此可见类比对象的结构体中多了众多的成员,下面详细介绍objc_class各成员:

isa:

图一中:objc_object (对象)中isa指针指向的类结构称为Class(也就是该对象所属的类),其中存放着普通成员变量与实例方法(“-”开头的方法)

图二中:isa指针指向的类结构称为metaclass,其中存放着static类型的成员变量与static类型的方法(“+”开头的方法)。

super_class: 指向该类的父类的指针,如果该类是基类,那么super_class就是NULL。

通过一幅图来看一下OC中类与对象的继承层次关系:

屏幕快照 2016-04-12 16.29.40.png

所有的metaclass中isa指针都是指向根metaclass,而根metaclass则指向自身。

根metaclass是通过继承根类产生的,与根class结构体成员一致,不同的是根metaclass的isa指针指向自身。

当我们调用某个对象的实例方法时,它会首先在自身isa指针指向的类(Class)methodLists中查找该方法,如果找不到,就会通过class的super_class指针找到其父类,然后从父类methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父类结构结构体中查找,直至根class。

当我们调用某个类方法时,它会首先通过自己的isa指针找到metaclass,并从它的methodLists中查找该类方法,如果找不到则会通过metaclass的super_class指针找到父类的metaclass结构体,然后从methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父类结构中查找,直至根metaclass。

加油~

你可能感兴趣的:(2016笔记——Runtime(三))