web-dev-qa-db-ja.com

NSMutableArrayオブジェクトの合計サイズ

オブジェクトの束を保持するNSMutableArrayがありますが、arrayが使用しているメモリ量を把握しようとしています。いくつかの場所を見た後、呼び出しのサイズについて知っています。呼び出しを行うと、32ビット(NSMutableArrayオブジェクトのサイズ)を取得します。

サンプルコード:

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

今、私はサイズを知りたいです:)

36
sj wengi

配列内のオブジェクトの数を取得するには、使用します

[temp count]

配列の合計メモリ使用量が必要な場合は、ループして各オブジェクトが使用するメモリ量を合計する必要がありますが、一般的なオブジェクトがそのサイズを与えるとは思いません。ただし、一般的には、メモリの使用量について実際に心配する必要はありません。

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

class_getInstanceSize は/usr/include/objc/runtime.hで宣言されていることに注意してください

また、これは各クラスで宣言されたivarのメモリサイズのみをカウントすることに注意してください。

8
Ed Marty

すべてのオブジェクトは参照によって保存されるため、これを行う直接的な方法はありません。特にオブジェクトには複数の所有者がいるため、二重カウントなどの問題が発生する可能性があるため、ココアには「サイズ」の具体的な概念はありません。

5
cobbal

NSArray、およびそれに含まれるすべてのオブジェクト、およびそれらのすべてのサブオブジェクト(再帰的になど)がNSCoderに応答する場合、配列を一時的なNSDataメモリチャンクにシリアル化して、そのメモリサイズを取得できる場合がありますフラットな一時オブジェクト。

4
hotpaw2

さて、あなたは次のようなことをすることができます:

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

しかし、それはexactly配列が実際に使用しているストレージの量を示していません。もちろん、コレクションを再帰的に処理する必要があります。

使用しているメモリの量を把握しようとしている場合は、Instrumentsのチュートリアルを掘り下げて、それが提供するメモリ使用量のプローブを理解することをお勧めします。

2
NSResponder