Общий размер объекта NSMutableArray - PullRequest
35 голосов
/ 04 октября 2009

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

Пример кода:

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

сейчас хочу узнать размер:)

Ответы [ 5 ]

98 голосов
/ 04 октября 2009

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

[temp count]

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

7 голосов
/ 04 октября 2009
size_t size = class_getInstanceSize([temp Class]);
for (id obj in temp) {
    size += class_getInstanceSize([obj Class]);
}

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

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

5 голосов
/ 04 октября 2009

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

4 голосов
/ 10 января 2011

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

2 голосов
/ 04 октября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...