2009-10-04 3 views
34

У меня есть NSMutableArray, который содержит кучу объектов, что я пытаюсь выяснить, сколько памяти используется array. Посмотрев на пару мест, я знаю о размере звонка, и когда я это сделаю, я получаю 32 бита (это размер объекта NSMutableArray).Общий размер объекта NSMutableArray

Пример код:

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

теперь я хочу знать размер :)

ответ

5

Там нет прямого способа сделать это, так как все объекты просто хранится в виде ссылки. В какао нет конкретного понятия «размер», тем более что объекты могут иметь несколько владельцев, что может привести к двойному счету или другим проблемам.

+4

Согласен. Использование '-count' покажет вам, сколько объектов находится в массиве, и вы можете умножить на размер указателя, чтобы получить приблизительную оценку, но массив может использовать гораздо больше места (в частности, изменяемый массив), чтобы это могло превратиться так или иначе. В зависимости от вашей цели это может быть или не быть более полезным, чем суммирование размеров экземпляров, которые он имеет. В общем, я согласен с @cobbal, что множественное владение усложняет ситуацию и делает менее важным знать точные размеры. Для больших массивов или больших объектов да, но, как всегда, сначала измерьте производительность. :-) –

93

Чтобы получить количество объектов в массиве, используйте

[temp count] 

Если вы хотите, общее использование памяти массива, вам придется перебрать и сложить, сколько памяти каждый объект использует, но я не думаю, что общий объект даст вам свой размер. В общем, вам не стоит беспокоиться об использовании памяти.

2

Ну, вы могли бы сделать что-то вроде:

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

, но это не говорит вам точно сколько памяти массив фактически используется, так как она может расти динамически и может иметь больше памяти в любом когда ему нужно только для объектов, на которые он указывает, и, конечно же, вам придется рекурсивно решать любые коллекции.

Если вы пытаетесь понять, сколько памяти вы используете, я предлагаю вникнуть в учебные пособия для инструментов и получить голову вокруг зондов памяти, которые она предоставляет.

+0

Массив фактически содержит только указатели на объект, поэтому он вычисляет совокупный размер объектов, хранящихся в массиве, но не учитывает объект, который появляется более одного раза, и не будет указывать на потребляемую память самой 'temp'. –

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

Обратите внимание, что class_getInstanceSize объявлен в /usr/include/objc/runtime.h

Также отметим, что это будет рассчитывать только размер памяти из Ивар, объявленных в каждом классе.

+0

Имеет в значительной степени те же недостатки, что и ответ NSResponder. –

+0

Я думаю, вопрос в том, насколько точным вам нужен результат, и он должен работать во всех случаях для любого возможного объекта.Если вы знаете типы объектов, которые собираетесь добавить в массив, гораздо проще определить использование памяти. –

+0

Кроме того, если вы добавляете массивы в массивы, вы можете суммировать эти размеры с помощью рекурсивных вызовов функции суммирования для любого объекта, который реализует NSFastEnumerator –

4

Если NSArray и все объекты, которые он содержит, и все их под-объекты (рекурсивно и т. Д.) Отвечают на NSCoder, вы можете сериализовать массив во временном фрагменте памяти NSData, а затем получить память размер этого одного плоского временного объекта.

Смежные вопросы