对象的分类

2022-02-21  本文已影响0人  biu_iOS
对象的分类

对象分为 实例对象、类对象、元类对象

对象的数据结构
1. 实例对象
@interface Father : NSObject {
    int _age;
}
@end

转化成c++代码以后可以发现

struct Father_IMPL {
    Class isa;
    int _age;
};

可以发现 实例对象的本质是结构体,(在c++文件中查找类名_IMPL就能找到这个结构体),里面有一个isa指针和其他成员变量。所以实例对象在内存中存储的内容是 isa指针 + 其他成员变量具体值

1.isa是什么? isa是一个指向类对象的指针(实例对象的isa指向类对象)
2.每个实例对象会存储成员变量的值
3.每一个实例对象是唯一的

那方法是存储在哪的呢 我们在Father里加一个属性

@interface Father : NSObject {
    int _age;
}
@property (nonatomic, assign) int height;
@end

那么转成c++ 是什么样的呢?

struct Father_IMPL {
    Class isa;
    int _age;
    int _height;
};
2. 类对象

同一个类是一个对象 每个类在内存中有且只有一个class对象
所以类对象存储的都是一些公共的信息 数据结构

class对象在内存中存储的信息主要包括
isa指针 (指向元类对象)
superclass指针 (指向父类的类对象)
类的属性信息(@property)、类的对象方法信息(instance method)
类的协议信息(protocol)、类的成员变量信息(ivar)...


235845499_11_20211213082128771.jpg
成员变量的值时存储在实例对象中的,因为只有当我们创建实例对象的时候才为成员变赋值。但是成员变量叫什么名字,是什么类型,只需要有一份就可以了。所以存储在class对象中
3.元类对象
Class objectMetaClass = object_getClass([NSObject class]);

objectMetaClass是NSObject的meta-class对象(元类对象)
每个类在内存中有且只有一个meta-class对象

meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
isa指针
superclass指针
类的类方法信息(class method)
......


235845499_12_20211213082129177.jpg
meta-class对象和class对象的内存结构是一样的,所以meta-class中也有类的属性信息,类的对象方法信息等成员变量,但是其中的值可能是空的。
superclass指针
WeChat7a9f96df24d38b17a577f7f2d5f1ad85.png
对isa、superclass总结

instance的isa指向class
class的isa指向meta-class
meta-class的isa指向基类的meta-class,基类的isa指向自己 (为什么?)
class的superclass指向父类的class,如果没有父类,superclass指针为nil
meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class
instance调用对象方法的轨迹,isa找到class,方法不存在,就通过superclass找父类
class调用类方法的轨迹,isa找meta-class,方法不存在,就通过superclass找父类

上一篇下一篇

猜你喜欢

热点阅读