02.OC有几种对象
之前章节
01.OC实例对象的本质
在讲接下来的内容前,让我们先来认识下OC究竟有多少种对象
OC对象总共有三种
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
instance对象
它主要通过类alloc出来,每次alloc都是新的对象,在内存中存储的信息有
- 成员变量(包括isa指针也是成员变量)
例如我们在第一章节讲的就是实例对象
class对象
获取方法
- 实例对象class方法
- 类class方法
-
运行时object_getClass函数
class类对象的获取方法
如上图,大家输出的三个地址是一样的么?
答案是肯定的:类对象是唯一的,只存在一个,它在内存中存储的信息主要有
- isa指针
- superclass指针
- 类的属性property
- 类的对象方法信息instance method
- 类的协议信息 protocol
- 类的成员变量信息ivar(一些描述信息,如类型 名称)
- ...
meta-class元类对象
获取方法
-
运行时object_getClass函数
meta-class获取方法
从上图代码我们可以看到,他们输出的地址是不一样的,元类也是唯一的,而且内存结构与Class一致,只不过用途不一样,它在内存中存储的信息主要有
- isa指针
- superclass指针
- 类的类方法信息(class method)
- ...
如果我们要判断它是否是元类对象,可以这样写
bool isMetaClass = class_isMetaClass(mc);
注意,以下代码获取的还是类对象而不是元类对象
Class cls = [[Animal class] class];
bool isMetaClass = class_isMetaClass(cls); // 为NO
可能你会说,光靠嘴上说说如何证明,那么我们就直接来看看runtime的源码,摘自objc4-818.2版本
首先我们找到Class编译后的结构体objc_class
过期的objc_class源码
我们应该看最新版本的objc_class源码,在objc_runtime-new中,部分源码如图
objc_class最新源码
它有一个叫superclass的成员变量,这就证明了每个对象都拥有superclass成员,那isa又在哪里呢,可以看到objc_class继承自objc_object,那我们继续看看objc_object里面有什么
objc_object最新源码
它拥有一个isa指针变量,这就证明了对象由isa成员变量,接下来我们继续看objc_class里面还有什么,它还有一个cache(不理)和bits,bits为class_data_bits_t结构体,继续查看class_data_bits_t定义
class_data_bits_t源码
大概是这样子
class_ data_ bits_t结构图
在class_rw_t源码中,我们可以找到以下代码
class_rw_t部分源码
大概是这样子
class rw t结构图
分别有方法列表、协议列表、属性列表等,这也就证明了我们前面说的对象包含了什么,另外,class_rw_t还包含了一个class_ro_t,它有什么东西,具体看下图
class_rw_t的class_ro_t
class_ro_t部分源码
从图可以看到它拥有了name、ivars、baseMethodList、baseProtocols、baseProperties等等...,大概是这样子
class_ro_t结构图
那这些有啥用呢,留到后续再讲,这里先给大家一个印象
最后,整个类基础数据结构图大概是这样
objc_object结构图
以上我们从源码角度分析了object包含了什么,其实也可以从运行代码调试角度来查看,复写它们的结构体成员就可以在xcode调试查看了,这里不做示范
扩展
- class_rw_t -> class_readwrite_table -> 可以读写的表
- class_ro_t -> class_readonly_table -> 只读的表
- ivars -> instance variable 复数 -> 成员变量们
OC对象的类别讲到这里,接下来将介绍isa和superclass的用途
本文部分知识参考自李明杰老师的教程