02.OC有几种对象

2021-08-19  本文已影响0人  白开了杯水

之前章节
01.OC实例对象的本质

在讲接下来的内容前,让我们先来认识下OC究竟有多少种对象
OC对象总共有三种

instance对象

它主要通过类alloc出来,每次alloc都是新的对象,在内存中存储的信息有

class对象

获取方法

如上图,大家输出的三个地址是一样的么?
答案是肯定的:类对象是唯一的,只存在一个,它在内存中存储的信息主要有

meta-class元类对象

获取方法

从上图代码我们可以看到,他们输出的地址是不一样的,元类也是唯一的,而且内存结构与Class一致,只不过用途不一样,它在内存中存储的信息主要有

如果我们要判断它是否是元类对象,可以这样写

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调试查看了,这里不做示范

扩展

OC对象的类别讲到这里,接下来将介绍isa和superclass的用途
本文部分知识参考自李明杰老师的教程

上一篇下一篇

猜你喜欢

热点阅读