Подтвердить что ты не робот

Общий размер объекта NSMutableArray

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

Пример кода:

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

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

4b9b3361

Ответ 1

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

[temp count]

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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