2013-07-25 36 views
4

这可能是一个基本问题,但只是想知道答案。当我们在iOS Obj C程序中创建像int,NSString,NSDictionary,NSData等每个变量时,将占用多少内存。我希望,它会类似于基于数据类型(或)的大小不同的C程序吗?iOS:数据类型分配的内存消耗

谢谢!

回答

1

您可以通过调用这个,一个例子得到任何阶级的大小:

#import "objc/runtime.h" 
int size = class_getInstanceSize([NSDictionary class]); 
+1

这是非常保证*永不*返回有用的信息。首先,'NSDictionary'是一个抽象类,因此,你从来没有实际类的实例。其次,'NSDictionary' - 就像其他所有类一样 - 支持与实例分配分开分配的商店。 – bbum

1

这取决于内容,你想投入到这个类(的NSString,的NSDictionary,NSData的)。你可以说NSMutableString等改变了他们的大小,但他们只是重新分配自己。

3

总之,你不能。至少不是有用的方式。

几乎每个类都将有任何数量的分配不直接记入实例的分配直接。同样,很多类 - NSDictionaryNSArrayNSString - 实际上是类集群的一部分,因此实际分配的是子类。最后,对于各种收集和数据类别,相关分配的大小将根据其内容大幅变化。某些类 - UIImage,NSData等 - 可能包含实际上并未由堆分配表示的MB数据,因为它们正在映射来自文件系统的数据。

或者,总而言之,class_getInstanceSize()是无用的。

相反,您需要关注应用程序的内存使用情况,以此作为其操作行为的系统特征。分配工具可以在测量内存使用情况方面做得很好,更重要的是,可以帮助您确定其中的消费负责。

2

您应该考虑Objective-C对象的大小,您不能依赖的实现细节。他们可能碰巧从一个环境到另一个环境是一致的,但他们不提供这种保证。此外,由于可能以各种聪明的方式实施,所以没有一致和完整的方式来衡量它们的大小。

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