1.什么是isa指针
概念:
Every object has an isa instance variable that identifies the object's class. The runtime uses this pointer to determine the actual class of the object when it needs to.
每个对象都有一个标识对象类的isa实例变量. 运行时使用此指针来确定对象需要的实际类.(isa 可以理解为这是个什么类).
在xcode中用快捷键Shift+Cmd+O 打开文件objc.h 能看到类的定义:
从图可以看出三点:
- id类型是一个objc_object结构体的指针
- objc_object结构体包含一个Class类型的变量isa
- Class是objc_class结构体的指针.
事实上OC中的runtime中, 类是用objc_class结构体表示的, 对象是用objc_object结构体表示的. 这也就解释了为什么id类型可以指向OC中任意对象类型了.
objc_class结构体的结构:
struct objc_class {
Class isa //所属类的指针
Class super_class//指向父类的指针
const char *name //类名
long version // 版本
long info //供运行期使用的一些位标识。
long instance_size //实例大小
struct objc_ivar_list *ivars //成员变量数组
struct objc_method_list **methodLists //方法列表
struct objc_cache *cache//指向最近使用的方法.用于方法调用的优化
struct objc_protocol_list *protocols//协议的数组
}
看到第一个变量有点崩溃, 但说明了万物皆对象, 类也是对象, 类是meteClass(元类)的实例.
总结一下:
- 实例对象在运行时蓓表示成objc_object类型结构体, 结构体内部有isa指针指向objc_class结构体.
- objc_class内部保存了类的变量和方法列表以及其他信息, 并且还有一个isa指针.这个isa指针指向meteClass(元类), 元类里保存了这个类的类方法列表.
-
元类里也有isa指针, 这个isa指针指向根源类, 根源类的isa指针指向自己.
第二个参数superClass的实现: