美文网首页
对象的分类

对象的分类

作者: biu_iOS | 来源:发表于2022-02-21 16:23 被阅读0次
对象的分类

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

对象的数据结构
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找父类

相关文章

  • 对象的分类

    对象的分类 对象分为 实例对象、类对象、元类对象 对象的数据结构 1. 实例对象 转化成c++代码以后可以发现 可...

  • 对象分类

    ECMA标准固有对象 https://www.ecma-international.org/ecma-262/9....

  • 12.2.类分类

    分类.h文件: 分类.m文件: 关联对象

  • javascripts面向对象基础

    js中对象的分类 对象的分类: 1.内置对象:由ECMA实现 的,不依赖于宿主环境的对象,这些对象在js程序执行之...

  • RunTime之NSObject解析

    写在前边 上篇文章中,介绍了Objc对象的分类:实例对象、类对象、元类对象;也介绍了对象分类中通过isa或supe...

  • OC对象的分类

    写在前面 一些知识也许我们都知道,但是可能脉络不是很清晰,接下来就捋一捋这些容易绕晕的知识点。 不晕的外圈 OC ...

  • OC对象的分类

    OC对象的分类 - instance对象(实例对象) instance对象就是通过类alloc出来的对象,每次调用...

  • OC对象的分类

    1.instance对象(实例对象)通过类alloc出来的对象 是不同的对象,分别占用不同的内存, instanc...

  • OC对象的分类

    Objective-C中的对象,主要可以分为3种 1. instance对象(实例对象)2. class对象(类对...

  • OC对象的分类

    Objective-C对象的分类 Objective-C中的对象也叫OC对象,主要分为三类:1.实例对象(inst...

网友评论

      本文标题:对象的分类

      本文链接:https://www.haomeiwen.com/subject/giyylrtx.html