【发布时间】:2013-11-18 01:56:54
【问题描述】:
我知道当一个对象在堆上实例化时,至少分配了足够的内存来保存对象的 ivars。我的问题是关于编译器如何存储方法。内存中是否只有一个方法代码实例?还是代码在内存中生成对象的固有部分,与 ivars 连续存储并执行?
如果是后者,即使是像 NSStrings 这样的微不足道的对象也需要(相对)大量的内存(NSString 也继承自 NSObject 的方法)。
或者该方法是否在内存中存储一次并传递一个指向拥有它的对象的指针?
【问题讨论】:
-
每个对象(至少是普通对象)都有一个类。有一个从对象指向其类对象的指针(当然,它有自己的指向类对象的指针,但我们不会去那里)。类对象由该类的所有对象共享,并且类的方法与类对象绑定。
-
你为什么关心这个?
-
你要明白的是,对象在内存中的存储方式是一个实现细节。 Apple 可以选择将每个对象设为 64 位整数数组,并将每个方法设为指向一些随机 OS 代码块的指针,以供您关心。您只需要担心 Objective-C 是否按照包装盒上的说明进行操作。
-
@BryanChen:好奇(特别是关于你的工具如何工作)可能是程序员可以拥有的最重要的特质。你为什么关心他为什么好奇?
-
我的意思是它是实现细节。大多数情况下,您的代码不应依赖于实现细节,因为它们可能会发生变化。除非您遇到严重的性能问题或发现(潜在)错误,否则您应该能够在不了解这些知识的情况下编写代码。
标签: objective-c methods objective-c-runtime