![]() |
1
2
可以想象,一个Objective-C对象只是一个C结构,它看起来像这样:
该结构的一个实例在32位系统上需要4个字节。因为它是由单个指针组成的,所以类与ID类似。 具有一个“char”实例变量的nsObject、mySubClass的子类如下:
子类在开始时只包含它的超级类的所有实例变量,在结束时则包含它自己的实例变量。通过在控制台中键入“p*object”,您可以在调试器中看到这一点。 在32位系统上,mysubclass的大小为5字节。一个指针加一个字符。所以,一个对象的大小就是它所有实例变量加在一起的大小。要知道的一件重要事情是,对象的大小只与它的实例变量相关。它不受方法数量的影响。随着更多实例的实例化,这些方法不需要额外的内存。方法具有固定的初始成本。 另一个需要考虑的问题是,对象通常有指向其他对象的指针作为实例变量。例如,假设每个uiview都有一个非可变数组来引用其子视图。该数组为空时可能为12个字节。因此,一个空的uiview将是uiview中所有变量的大小,其中包括指向数组的指针的4个字节,另外,您还可以解释实际数组实例使用的12个额外字节。不过,这都只是说明问题,数组和视图是两个不同的对象,但是如果没有数组,视图就不能真正使用。 最后,为了使malloc实现更快,并满足机器体系结构的某些约束,使指针正确对齐,大多数分配都被四舍五入到某个数量。另外,对象的实例变量之间可能有空填充,类似于 structure padding |
![]() |
2
2
这取决于超类实例变量的数量和性质。
所以任何子类
当然,这个计算不考虑初始化时这些实例变量引用的对象所使用的实际内存。例如,完全初始化的视图控制器可以保留占用大量内存的视图对象。 |
![]() |
3
2
尝试
|
![]() |
4
0
简言之,是的,但可能还不够,除非您打算实例化数万个实例,否则您需要担心它。 对象将为其每个ivar及其方法分配内存。所需的内存量取决于C类型…它们都根据所存储的数据类型而变化。 |
![]() |
5
0
使用的内存量取决于对象的实例化、在屏幕上显示以及与之交互的方式。例如,nsObject的子类不会与用户的触摸进行任何交互。 您始终可以将应用程序与Instruments Allocations性能工具附加在一起,以比较差异。 |
![]() |
Noah H · 如何通过终端或Swift禁用三指轻拍手势? 7 年前 |
![]() |
Dmitry Serov · 货币数字格式-数字为整数时省略分数部分 7 年前 |
![]() |
Duny · ObjC日期始终返回2017年12月25日 7 年前 |
![]() |
Jan Kaiser · NSButton不调用其操作 7 年前 |