如果我使我的对象成为 UIViewController 的子类,它是否比 NSObject 的子类使用更多的内存?一个关于复杂类的子类化与简单类的子类化所使用的开销的大概数字会很棒。编辑:或者自己找出差异的方法。
最佳答案
你可以想象一个 Objective-C 对象只是一个看起来像这样的 C 结构:
typedef struct {
Class isa;
} NSObject;
该结构的实例在 32 位系统上占用 4 个字节。由于它由单个指针组成 - Class 类似于 id。
NSObject 的子类 MySubclass 具有一个“char”实例变量,如下所示:
typedef struct {
Class isa;
char singleInstanceVariable.
} MySubclass;
子类只是将其父类(super class)的所有实例变量放在开头,并在末尾加上它自己的实例变量。您可以通过在控制台中键入“p *object”在调试器中看到这一点。
在 32 位系统上,MySubclass 的大小为 5 个字节。一个指针,加一个字符。因此,对象的大小是其所有实例变量的大小之和。要知道的一件重要的事情是对象的大小仅与其实例变量相关。它不受其拥有的方法数量的影响。随着实例化更多实例,这些方法不会消耗任何额外的内存。方法具有固定的初始成本。
要考虑的另一件事是对象通常将指向其他对象的指针作为实例变量。例如,假设每个 UIView 都有一个 NSMutableArray 来引用其 subview 。该数组在空时可能有 12 个字节。因此,空 UIView 将是 UIView 中所有变量的大小,其中包括指向数组的指针的 4 个字节,此外您还可能考虑实际数组实例使用的 12 个附加字节。这只是简单的计算,数组和 View 是两个不同的对象,但是如果没有数组, View 就无法真正使用。
最后,大多数分配都会向上舍入到某个量子,以便使 malloc 实现更快并满足机器体系结构的一些约束,以便指针正确对齐。此外,对象的实例变量之间可能有空填充,类似于 structure padding
关于objective-c - 所有对象占用的内存量都相似吗? Objective-c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4281701/