iOS底层原理系列02-深入了解Objective-C

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中的类指针链主要有两条:

  1. isa指针链:实例对象的isa指向类对象,类对象的isa指向元类对象,元类对象的isa指向根元类对象(通常是NSObject的元类)。根元类对象的isa指向自己,形成闭环。
  2. superclass指针链:子类的superclass指向父类,直到根类(通常是NSObject),根类的superclass为nil。而元类的superclass指向父类的元类,根元类的superclass指向根类对象。

这两条链共同构成了Objective-C的继承体系和消息传递机制的基础。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值