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