返回
探究OC之对象的分类与描述
IOS
2023-09-16 08:51:59
OC对象分类
在OC中,对象分为三类:instance对象、类对象和meta类。
instance对象 :也称为实例对象,是通过类alloc
方法分配出来的对象。每次调用alloc
都会产生一个新的instance对象,每个instance对象在内存中存储的信息包括:isa指针和其他成员变量。
类对象 :也称为类符,了一个类的信息,如类名、父类名、方法列表等。每个类都对应一个类对象,通过objc_getClass()
方法可以获取。
meta类 :也称为元类,是类对象的类,负责管理类的行为,例如:创建类对象、分配实例对象、响应消息等。每个类都有一个meta类,通过object_getClass()
方法可以获取。
isa指针
每个OC对象都包含一个指向其meta类的指针,称为isa指针。isa指针指向meta类对象,用于确定对象的类型、查找方法实现、消息转发等。
isa指针的作用 :
- 确定对象类型:通过isa指针可以唯一标识对象的类型。
- 查找方法实现:当对象接收到消息时,会根据isa指针找到该消息的实现方法。
- 消息转发:当对象收到一条它不认识的消息时,会通过isa指针将消息转发给它的meta类。
isa指针的原理 :
isa指针存储在对象的第一个成员变量中,因此可以通过偏移量0
访问。isa指针是一个指向meta类的指针,meta类也是一个对象,因此也可以通过isa指针访问meta类的isa指针。
实例
// 创建一个Person类对象
Class personClass = objc_getClass("Person");
// 获取Person类的meta类对象
Class personMetaClass = object_getClass(personClass);
// 创建一个Person实例对象
Person *person = [[Person alloc] init];
// 获取Person实例对象的isa指针
id isa = object_getIvar(person, 0);
// 打印Person实例对象的isa指针
NSLog(@"Person实例对象的isa指针:%@", isa);
// 获取Person实例对象的meta类对象
Class personMetaClass2 = object_getClass(person);
// 打印Person实例对象的meta类对象
NSLog(@"Person实例对象的meta类对象:%@", personMetaClass2);
输出结果:
Person实例对象的isa指针:0x100000840
Person实例对象的meta类对象:0x100000840
从输出结果可以看出,Person实例对象的isa指针指向了Person的meta类对象。这说明isa指针的作用是确定对象的类型和查找方法实现。
总结
OC对象的分类为instance对象、类对象和meta类。每个OC对象都包含一个指向其meta类的指针,称为isa指针。isa指针的作用是确定对象类型、查找方法实现和消息转发。通过理解OC对象的分类和isa指针的原理,可以更深入地理解OC的内存布局和消息传递机制。