gpt4 book ai didi

objective-c - Objective-C 类的方法存储在哪里以及如何存储?

转载 作者:太空狗 更新时间:2023-10-30 03:59:25 24 4
gpt4 key购买 nike

我知道当一个对象在堆上被实例化时,至少会分配足够的内存来保存对象的ivars。我的问题是关于编译器如何存储方法。内存中是否只有一个方法代码实例?还是代码在内存中生成对象的固有部分,与 ivar 连续存储并执行?

似乎如果是后者,即使是像 NSString 这样的小对象也需要(相对)大量的内存(NSString 继承自 的方法code>NSObject,还有)。

或者方法是在内存中存储一​​次并传递一个指向拥有它的对象的指针?

最佳答案

在“标准”的 Objective-C 运行时,每个对象在任何其他实例变量之前都包含一个指向它所属类的指针,就好像 Object 基类有一个名为的实例变量:

Class isa;

给定类的每个对象共享相同的 isa 指针。

该类包含许多元素,包括一个指向父类的指针,以及一个方法列表数组。这些方法是专门在这个类上实现的。

struct objc_class {
Class super_class;
...
struct objc_method_list **methodLists;
...
};

这些方法列表中的每一个都包含一个方法数组:

struct objc_method_list {
int method_count;
struct objc_method method_list[];
};

struct objc_method {
SEL method_name;
char *method_types;
IMP method_imp;
};

这里的IMP 类型是一个函数指针。它指向内存中存储方法实现的(单个)位置,就像任何其他代码一样。


注释:我在这里描述的实际上是 ObjC 1.0 运行时。当前版本不像这样存储类和对象;它做了很多复杂、聪明的事情来使方法调用更快。但我所描述的仍然是它如何工作的精神,即使不是它的确切方式。

我还在其中一些结构中遗漏了一些字段,这只会混淆情况(例如,向后兼容性和/或填充)。如果您想查看所有详细信息,请阅读真正的标题。

关于objective-c - Objective-C 类的方法存储在哪里以及如何存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20038810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com