代码之家  ›  专栏  ›  技术社区  ›  Kenny Winker

所有对象是否占用相同的内存量?目标-C

  •  0
  • Kenny Winker  · 技术社区  · 14 年前

    如果我将我的对象设置为uiviewcontroller的子类,它是否比它是nsObject的子类使用更多的内存?对于复杂类和简单类的子类使用了多少开销,一个大概的数字是很好的。编辑:或者是一种自己解决问题的方法。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Jon Hess    14 年前

    可以想象,一个Objective-C对象只是一个C结构,它看起来像这样:

    typedef struct {
        Class isa;
    } NSObject;
    

    该结构的一个实例在32位系统上需要4个字节。因为它是由单个指针组成的,所以类与ID类似。

    具有一个“char”实例变量的nsObject、mySubClass的子类如下:

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

    子类在开始时只包含它的超级类的所有实例变量,在结束时则包含它自己的实例变量。通过在控制台中键入“p*object”,您可以在调试器中看到这一点。

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

    另一个需要考虑的问题是,对象通常有指向其他对象的指针作为实例变量。例如,假设每个uiview都有一个非可变数组来引用其子视图。该数组为空时可能为12个字节。因此,一个空的uiview将是uiview中所有变量的大小,其中包括指向数组的指针的4个字节,另外,您还可以解释实际数组实例使用的12个额外字节。不过,这都只是说明问题,数组和视图是两个不同的对象,但是如果没有数组,视图就不能真正使用。

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

        2
  •  2
  •   Ole Begemann    14 年前

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

    所以任何子类 ui视图控制器 将占用尽可能多的内存来存储所有这些ivar及其超类的所有ivar( UIResponder (无IVARS)和 N对象 (一个IVAR))。

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

        3
  •  2
  •   Jens Ayton    14 年前

    尝试 class_getInstanceSize([MyClass class]); . 大致来说,一个实例的内存使用量将是这个值的四舍五入到16个字节的倍数。当然,这不包括任何相关对象的开销(请参见 objc_setAssociatedObject )或者类所做的分配。

        4
  •  0
  •   d11wtq Vadim Baryshev    14 年前

    简言之,是的,但可能还不够,除非您打算实例化数万个实例,否则您需要担心它。

    对象将为其每个ivar及其方法分配内存。所需的内存量取决于C类型…它们都根据所存储的数据类型而变化。

        5
  •  0
  •   Evan Mulawski    14 年前

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

    您始终可以将应用程序与Instruments Allocations性能工具附加在一起,以比较差异。