揭秘iOS底层奥秘:isa和superclass的奇妙世界
2023-11-26 17:16:32
isa指针
isa指针,全称为Instance Variable Address,是一个指向当前对象类对象的指针。每个对象都会有一个isa指针,用于识别对象的类型和实现多态。
例如,假设我们有一个Student类,其中包含name和age两个属性,我们创建一个Student对象student。我们可以使用[student isa]来获取student的isa指针,该指针指向Student类的类对象,其中包含Student类的所有属性和方法的。
class对象的superclass指针
每个class对象都有一个superclass指针,指向其父类的类对象。这意味着子类可以访问父类的属性和方法。例如,Student类是NSObject类的子类,因此Student类的superclass指针指向NSObject类的类对象。
当我们向Student对象发送消息时,系统会先在Student类中寻找该消息对应的实现,如果没有找到,则会沿着superclass指针向上查找,直到找到该消息的实现为止。
class对象的superclass指针
每个class对象都有一个superclass指针,指向其父类的类对象。这意味着子类可以访问父类的属性和方法。例如,Student类是NSObject类的子类,因此Student类的superclass指针指向NSObject类的类对象。
当我们向Student对象发送消息时,系统会先在Student类中寻找该消息对应的实现,如果没有找到,则会沿着superclass指针向上查找,直到找到该消息的实现为止。
meta-class对象的superclass指针
每个meta-class对象都有一个superclass指针,指向其父meta-class对象的类对象。这意味着子类的meta-class可以访问父类meta-class的属性和方法。例如,Student类的meta-class是NSObject类的meta-class的子类,因此Student类的meta-class的superclass指针指向NSObject类的meta-class。
meta-class对象是用于类本身的类对象,因此meta-class的superclass指针指向父类的meta-class对象。meta-class对象也拥有isa指针,指向其父类的meta-class对象。
isa细节
每个对象的isa指针都存储在该对象的内存布局的开头。这使得系统可以在常数时间内获取对象的类型。
isa指针可以被修改,这可以实现诸如对象替换、热交换等高级技术。但是,修改isa指针是一项危险的操作,必须谨慎使用。
isa、superclass总结
- isa指针指向当前对象的类对象。
- class对象的superclass指针指向其父类的类对象。
- meta-class对象的superclass指针指向其父meta-class对象的类对象。
- isa指针可以被修改,但必须谨慎使用。
理解了isa指针和superclass指针,我们才能更加深入地理解iOS中的内存管理、对象继承、消息传递等底层奥秘。