所有对象都占用相似数量的内存吗? Objective-C的

时间:2010-11-26 00:14:31

标签: objective-c cocoa memory nsobject

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

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

试试class_getInstanceSize([MyClass class]);。粗略地说,实例的内存使用量将该值四舍五入为十六个字节的倍数。当然,这不包括任何相关对象的开销(参见objc_setAssociatedObject)或类所做的分配。

答案 2 :(得分:2)

你可以想象一个objective-c对象只是一个C结构,如下所示:

typedef struct {
    Class isa;
} NSObject;

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

NSObject的子类,带有一个'char'实例变量的MySubclass看起来像这样:

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

子类在开头只是简单地包含其超类的所有实例变量,最后加上它自己的实例变量。您可以在调试器中通过在控制台中键入“p * object”来查看此内容。

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

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

最后,大多数分配被四舍五入到一些量子,以便使malloc实现更快并满足机器体系结构的某些约束,以便指针正确对齐。此外,对象的实例变量可能在它们之间具有空填充,类似于structure padding

答案 3 :(得分:0)

简而言之,是的,但可能还不够,你需要担心它,除非你计划实例化数万个。

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

答案 4 :(得分:0)

使用的内存量取决于对象的实例化方式,屏幕上显示以及与之交互的方式。例如,NSObject的子类将不会与用户的触摸进行任何交互。

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