注册

iOS 对象的关联---isa/superclass指针

类对象和元类对象的存储结构里面都包含了一个isa指针,今天我们来看看它的作用,以及实例对象类对象元类对象之间的关联


822e0d81fc88921ee1286bb461980484.png


  • 实例对象的isa指针

    • 当实例对象(instance)调用对象方法的时候,实例对象的isa指针指向类对象(class),在类对象中,查找对象方法并调用
  • 类对象的isa指针

    • 类对象(class)的isa指针指向元类对象(meta-class),当调用类方法时,类对象的isa指针指向元类对象,并在元类里面找到类方法并调用


dc9ff9c9a067e0f2a2b856f60d18eefe.png


二.类对象的superclass 指针

  • 先两个类,一个Person继承自NSObject,一个类继承自Person
/// Person继承自NSObject
@interface Person : NSObject
-(void)perMethod;
+(void)perEat;
@end

@implementation Person

-(void)perMethod{

}
+(void)perEat{

}

@end



/// student继承自Person
@interface Student : Person
-(void)StudentMethod;
+(void)StudentEat;
@end
@implementation Student

-(void)StudentMethod{

}
+(void)StudentEat{

}

  • 当实例对象调用自身的对象方法时,它在自身的class对象中找到StudentMethod方法

        Student *student = [[Student alloc]init];
[student StudentMethod]
  • 当实例对象调用父类的方法的时候
        Student *student = [[Student alloc]init];
[student perMethod];

3cbe78d2c70d6c1133e0f2555f945ea2.png


当子类调用父类的实例方法的时候,子类的class类对象的superclass指针指向父类,直至基类(NSObject)找到方法并执行(注意,这里指的是实例方法,也就是减号方法)

三.元类对象的superclass 指针

当子类调用父类的类方法的时候,子类的superclass指向父类,并查找到相应的类方法,调用

[Student perEat];

05bc28174fb8241f50ecbcf939e6b91d.png


总的来说,isa,superclass的的关系可以用一副经典的图来表示


003a8fa4533c8c314a27d19cfb5b8efa.png


instance的isa指向class

class的isa指向meta-class

meta-class的isa指向基类的meta-class

class的superclass指向父类的class



作者:枫紫_6174
链接:https://www.jianshu.com/p/ffb021a4b97c

0 个评论

要回复文章请先登录注册