在OC中任何类的定义都是对象,类和类的实例(对象)没有任何本质上的区别。任何对象都有isa指针。
那么什么是类呢?在Xcode中用快捷键Shift+Command+O 打开文件objc.h 能看到类的定义:
从图中可以看出:
Class 是一个objc_class结构类型的指针
id 是一个objc_object结构类型的指针
下面我再来看下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指针指向本身,形成一个封闭的内循环。