NSMutableArray对象的总大小

39

我有一个NSMutableArray,其中包含许多对象,我正在尝试弄清楚array使用了多少内存。在查看了几个相关的地方后,我知道了如何调用大小,并且当我调用它时,我得到了32位(这是NSMutableArray对象本身的大小)。

示例代码:

NSMutableArray *temp = [[NSMutableArray alloc]init];
[temp addObject:objectxyz];
[temp addObject:objectabc];
[temp addObject:object123];

现在我想知道大小 :)

5个回答

106

要获取数组中对象的数量,请使用

[temp count]

如果您想获取数组的总内存使用情况,您将需要循环遍历并累加每个对象使用的内存量,但我不认为通用对象会提供其大小。一般来说,您不需要太担心内存使用情况。


8
size_t size = class_getInstanceSize([temp Class]);
for (id obj in temp) {
    size += class_getInstanceSize([obj Class]);
}

请注意,class_getInstanceSize声明在/usr/include/objc/runtime.h中。另外,请注意,这仅计算每个类中声明的实例变量的内存大小。

几乎与NSResponder的答案具有相同的缺点。 - Quinn Taylor
我猜问题在于你需要多精确的结果,以及它是否需要适用于任何可能的对象的所有情况。如果你知道将要添加到数组中的对象类型,那么确定内存使用量就容易得多。 - Ed Marty
此外,如果您正在将数组添加到数组中,则可以通过对任何实现NSFastEnumerator的对象进行递归调用来使用求和函数总结这些大小。 - Ed Marty

5

由于所有对象只存储引用,因此没有直接的方法来做到这一点。在Cocoa中没有“大小”的具体概念,特别是因为对象可以有多个所有者,可能会导致重复计数或其他问题。


4
同意。使用“-count”命令可以告诉你数组中有多少个对象,然后你可以乘以指针的大小来得到一个大致的估计值,但是数组可能会使用更多的空间(特别是可变数组),因此这个估算可能会低估实际情况。根据你的目标是什么,这种方法可能比对所包含实例的大小求和更有帮助,但也可能没有。总的来说,我同意@cobbal的观点,多重所有权会使事情变得更加复杂,并且知道确切大小变得不那么重要。对于大型数组或大型对象,这是正确的,但是像往常一样,请先测量性能。 :-) - Quinn Taylor

4

如果NSArray及其所有包含的对象以及所有子对象(递归等)都响应NSCoder,则可以将数组序列化为临时NSData内存块,然后获取该单个临时对象的内存大小。


2

好的,您可以这样做:

size_t total;
id obj;
for (obj in temp)
  {
  total += class_getInstanceSize([obj class]);
  }

但这并不能准确告诉你数组实际使用了多少存储空间,因为它可以动态增长,并且在任何给定时间可能比指向的对象所需的内存更多,当然您还需要递归处理任何集合。

如果您想了解自己使用了多少内存,请建议深入研究Instruments的教程,并了解其提供的内存使用探针。


该数组实际上只保存对象的指针,因此这将计算存储在数组中的对象的总大小,但不会计算出现多次的对象,并且不会告诉您 temp 本身实际消耗的内存。 - Quinn Taylor

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