iOS:数据类型分配的内存消耗

4

这可能是一个基本问题,但我很好奇知道答案。在我们的iOS Obj C程序中创建每个变量(如int、NSString、NSDictionary、NSData等)时将占用多少内存。希望它与C程序类似,基于数据类型的大小(或者)不同吗?

谢谢!

5个回答

3
简而言之,你无法以有用的方式获取实例分配的大小。几乎每个类都会有许多不直接归因于实例分配的分配。此外,许多类 - NSDictionary、NSArray、NSString - 实际上是类簇的一部分,因此实际分配的是一个子类。最后,对于各种集合和数据类,相关分配的大小将根据其内容大幅变化。某些类 - UIImage、NSData等 - 可能包含数MB的数据,这些数据并没有通过堆分配来表示,因为它们正在从文件系统中映射数据。
总而言之,class_getInstanceSize()是无用的。相反,您需要关注您的应用程序的内存使用作为其操作行为的系统特征。分配工具可以很好地测量内存使用情况,并帮助您确定其中的消耗责任。

2

您应该将Objective-C对象的大小视为实现细节,不能依赖它们。它们可能在不同环境中保持一致,但不能保证。此外,由于它们可能以各种巧妙的方式实现,因此没有一种一致且完整的方法来测量它们的大小。

如果您需要精确管理内存分配,请使用C类型,它们本身就是完全有效的Objective-C。


1
您可以通过调用此方法来获取任何类的大小,例如:
#import "objc/runtime.h"
int size = class_getInstanceSize([NSDictionary class]);

1
这几乎可以保证永远不会返回有用的信息。首先,NSDictionary是一个抽象类,因此您永远不会拥有该实际类的实例。其次,NSDictionary - 就像几乎所有其他类一样 - 具有与实例分配分开的后备存储器。 - bbum

1

这取决于您想要放入这些类(NSString,NSDictionary,NSData)的内容。您可以说NSMutableString等会更改它们的大小,但它们只是重新分配自己。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接