0

如果我让我的对象成为 UIViewController 的子类,它是否会比它是 NSObject 的子类使用更多的内存?通过子类化复杂类与简单类相比,使用多少开销的大致数字会很棒。编辑:或者自己找出差异的方法。

4

5 回答 5

2

这取决于超类实例变量的数量和性质。NSObject有一个 ivar,即isa指针。UIViewController有大约 30 个 ivars,其中大部分是指针(您可以在 中查找列表UIViewController.h)。

因此,任何子类都UIViewController将占用存储所有这些 ivars 及其超类(UIResponder(无 ivars)和NSObject(一个 ivar))的所有 ivars 所需的内存。

当然,这个计算没有考虑这些实例变量在初始化时引用的对象所使用的实际内存。例如,一个完全初始化的视图控制器可能会持有一个占用大量内存的视图对象。

于 2010-11-26T00:22:14.850 回答
2

试试class_getInstanceSize([MyClass class]);。粗略地说,一个实例的内存使用量将是这个值四舍五入到十六字节的倍数。当然,这不包括任何关联对象的开销(请参阅 参考资料objc_setAssociatedObject)或类进行的分配。

于 2010-11-26T00:45:01.990 回答
2

你可以想象一个objective-c对象只是一个看起来像这样的C结构:

typedef struct {
    Class isa;
} NSObject;

该结构的一个实例在 32 位系统上将占用 4 个字节。由于它由单个指针组成 - Class 类似于 id。

NSObject 的子类 MySubclass 与一个 'char' 实例变量如下所示:

typedef struct {
    Class isa;
    char singleInstanceVariable.
 } MySubclass;

子类只是在开头包含其父类的所有实例变量,最后加上它自己的实例变量。您可以通过在控制台中键入“p *object”在调试器中看到这一点。

MySubclass 的大小在 32 位系统上为 5 个字节。一个指针,加一个字符。所以,一个对象的大小是它的所有实例变量加在一起的大小。要知道的一件重要事情是对象的大小仅与其实例变量有关。它不受它拥有的方法数量的影响。随着实例化更多实例,这些方法不会花费任何额外的内存。方法具有固定的初始成本。

要考虑的另一件事是对象通常具有指向其他对象的指针作为实例变量。例如,假设每个 UIView 都有一个 NSMutableArray 来引用它的子视图。该数组为空时可能为 12 个字节。因此,一个空的 UIView 将是 UIView 中所有变量的大小,其中包括指向数组的指针的 4 个字节,另外您可能还考虑了实际数组实例使用的 12 个额外字节。这只是会计,数组和视图是两个不同的对象,但是如果没有数组,视图就不能真正使用。

最后,为了使 malloc 实现更快并满足机器架构的一些约束,大多数分配都被四舍五入到某个量,从而使指针正确对齐。此外,对象的实例变量之间可能有空填充,类似于结构填充

于 2010-11-26T06:41:48.997 回答
0

简而言之,是的,但可能还不足以让您担心它,除非您计划实例化数以万计的它们。

该对象将为它的每个 ivars 及其方法分配内存。所需的内存量取决于 C 类型......它们都根据所存储的数据类型而有所不同。

于 2010-11-26T00:22:44.703 回答
0

使用的内存量取决于对象的实例化方式、在屏幕上的呈现方式以及与之交互的方式。例如,NSObject 的子类不会与用户的触摸发生任何交互。

您始终可以使用 Instruments Allocations 性能工具附加您的应用程序以比较差异。

于 2010-11-26T00:24:34.350 回答