39

我有一个NSMutableArray可以容纳一堆对象的东西,我想弄清楚正在array使用多少内存。在查看了几个地方之后,我知道了调用的大小,当我调用它时,我得到了 32 位(这是NSMutableArray它自身的对象的大小)。

示例代码:

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

现在我想知道大小:)

4

5 回答 5

106

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

[temp count]

如果您想要数组的总内存使用量,则必须循环并添加每个对象使用的内存量,但我认为通用对象不会给您它的大小。不过,一般来说,您不必担心内存使用情况。

于 2009-10-04T04:12:30.953 回答
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 中声明

另请注意,这只会计算每个类中声明的 ivars 的内存大小。

于 2009-10-04T04:21:37.250 回答
5

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

于 2009-10-04T04:09:28.107 回答
4

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

于 2011-01-09T21:50:17.103 回答
2

好吧,您可以执行以下操作:

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

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

如果您想了解您正在使用多少内存,我建议您深入了解 Instruments 的教程,并了解它提供的内存使用量探测器。

于 2009-10-04T04:21:18.893 回答