Objective c 是否所有对象都占用相似的内存量?目标-c

Objective c 是否所有对象都占用相似的内存量?目标-c,objective-c,cocoa,memory,nsobject,Objective C,Cocoa,Memory,Nsobject,如果我将我的对象设置为UIViewController的子类,它是否比作为NSObject的子类使用更多的内存?对于复杂类的子类化比简单类的子类化所使用的开销要大多少,给出一个大致的数字是很好的。编辑:或是自己找出差异的方法。这取决于超类实例变量的数量和性质NSObject有一个ivar,即isa指针UIViewController大约有30个ivar,其中大部分是指针(您可以在UIViewController.h中查找该列表) 因此,UIViewController的任何子类都将占用存储所有这

如果我将我的对象设置为UIViewController的子类,它是否比作为NSObject的子类使用更多的内存?对于复杂类的子类化比简单类的子类化所使用的开销要大多少,给出一个大致的数字是很好的。编辑:或是自己找出差异的方法。

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

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


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

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

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


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

简言之,是的,但可能不足以让您担心,除非您计划实例化数以万计的视图对象


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

简言之,是的,但可能还不足以让您担心,除非您计划实例化数以万计的数据类型


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

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


您始终可以使用Instruments Allocations performance tool连接应用程序,以比较差异。

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


您可以随时使用Instruments Allocations performance tool连接应用程序以比较差异。

请尝试
class_getInstanceSize([MyClass class])。粗略地说,一个实例的内存使用量是这个值的四舍五入到16字节的倍数。当然,这不包括任何关联对象(请参见
objc\u setassociated object
)或类所做的分配的开销。

Try
class\u getInstanceSize([MyClass class])。粗略地说,一个实例的内存使用量是这个值的四舍五入到16字节的倍数。当然,这不包括任何关联对象(请参见
objc\u setassociated object
)的开销或类所做的分配。

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

typedef struct {
    Class isa;
} NSObject;
typedef struct {
    Class isa;
    char singleInstanceVariable.
 } MySubclass;
这种结构的实例在32位系统上需要4个字节。因为它由一个指针组成,所以类类似于id

NSObject的子类MySubclass带有一个“char”实例变量,如下所示:

typedef struct {
    Class isa;
} NSObject;
typedef struct {
    Class isa;
    char singleInstanceVariable.
 } MySubclass;
子类只是在开始时拥有其超类的所有实例变量,在结束时拥有自己的实例变量。通过在控制台中键入“p*object”,可以在调试器中看到这一点

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

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


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

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

typedef struct {
    Class isa;
} NSObject;
typedef struct {
    Class isa;
    char singleInstanceVariable.
 } MySubclass;
这种结构的实例在32位系统上需要4个字节。因为它是由一个