1. Objective-C的本质
用Objective-C编写的代码,底层其实都是C\C++代码

所以Objective-C面向对象都是基于 C\C++的数据结构(结构体)实现的。
Objective-C并非像其他语言那样在编译期完全确定程序的行为,而是将许多决策推迟到运行时进行,这种特性被称为动态性,这是其区别于C++等静态语言的关键特性。
Objective-C的动态特性由Runtime系统提供支持。Runtime系统是一套C和汇编编写的API,是Objective-C面向对象和动态特性的基础。
// Objective-C程序最终会被编译为C语言代码
// 例如,一个简单的方法调用
[object method];
// 会被编译为
objc_msgSend(object, @selector(method));
这种消息发送机制(而非直接的函数调用)赋予了Objective-C强大的动态特性和灵活性。
2. OC对象
2.1 本质
Objective-C对象在底层实际上是一个结构体,这个结构体的定义在runtime源码中:
struct objc_object {
Class isa;
};
typedef struct objc_object *id;
所有OC对象都包含一个isa指针,指向该对象所属的类。这个isa指针是实现OC运行时动态特性的关键。
2.2 OC对象的种类
2.2.1 instance对象
Instance对象就是我们平时编程中最常见的实例对象。ininstance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象。
NSObject *obj = [[NSObject alloc] init];
这里的obj就是一个instance对象。
instance对象存储着:
- isa指针
- 其他成员变量
2.2.2 class对象
Class对象是由编译器创建的,每个类只有一个Class对象。获取Class对象的方法有:
// 方法1:通过类名获取
Class cls1 = [NSObject class];
// 方法2:通过实例对象获取
NSObject *obj = [[NSObject alloc] init];
Class cls2 = [obj class];
// 方法3:通过runtime方法获取
Class cls3 = object_getClass(obj);
Class对象存储着:
- isa指针
- superClass指针
- 实例方法列表(instance method)
- 成员变量列表(ivar)
- 协议列表(protocol)
- 属性列表(@property)
2.2.3 meta-class对象(元类对象)
Meta-Class对象也是一个Class对象,每个类在内存中有且只有一个meta-class对象。
Meta-Class存储着:
- isa指针
- superClass指针
- 类方法列表
- 类属性列表
获取Meta-Class对象:
Class cls = [NSObject class];
Class metaCls = object_getClass(cls);
3. isa指针与类指针链
OC中的对象结构通过isa指针形成了一个完整的指针链。这个指针链是OC面向对象实现和消息传递机制的基础。
3.1 isa指针
在OC中,每个对象都有一个isa指针,指向该对象的类信息。但实际上,在64位架构中,isa指针进行了优化,不再是直接指向Class对象的指针,而是使用了一种叫做指针位域的技术,即用一个64位的值来存储更多信息。
// 简化的64位架构isa定义
struct {
uintptr_t nonpointer : 1; // 是否启用指针位域优化
uintptr_t has_assoc : 1; // 是否有关联对象
uintptr_t has_cxx_dtor : 1; // 是否有C++析构函数
uintptr_t shiftcls : 33; // 存储Class、Meta-Class信息
// ...其他位域
};
从64bit开始,isa需要进行一次位运算,才能计算Class指针的真实地址,需要进行位运算:
Class cls = object_getClass(obj);
// 实际底层会进行位运算提取class指针
// 伪代码:isa & ISA_MASK
3.2 类指针链
Objective-C中的类指针链主要有两条:
- isa指针链:实例对象的isa指向类对象,类对象的isa指向元类对象,元类对象的isa指向根元类对象(通常是NSObject的元类)。根元类对象的isa指向自己,形成闭环。
- superclass指针链:子类的superclass指向父类,直到根类(通常是NSObject),根类的superclass为nil。而元类的superclass指向父类的元类,根元类的superclass指向根类对象。
这两条链共同构成了Objective-C的继承体系和消息传递机制的基础。


最低0.47元/天 解锁文章
1437






