Является ли NSMutableArray Cocoa редким? - PullRequest
1 голос
/ 11 июля 2011

Если я создаю NSMutableArray, который может иметь до 2 ^ 16 элементов, но в основном будет пустым, я буду тратить впустую пространство или NSMutableArray реализован как разреженный массив?

Ответы [ 3 ]

8 голосов
/ 11 июля 2011

Элементы в NSArray не могут быть пустыми, и значение по умолчанию отсутствует.Для представления nil вы обычно используете синглтон [NSNull null], который по-прежнему является ссылкой на объект, поэтому он потребляет память (указатель).Я хотел бы рассмотреть возможность использования NSDictionary (или NSMutableDictionary) с цифровыми (NSNumber) клавишами.

1 голос
/ 26 мая 2014

Нет, ни NSArray, ни NSMutableArray не являются разреженными массивами.Если у вас есть массив из 5000 записей со всем, кроме 4999, установленным на [NSNull null], он по-прежнему занимает пространство в 5000 записей.

Аналогично, NSPointerArray будет иметь место для 5000 записей со всеми записями.NULL кроме индекса 4999.

Я разработал объект разреженного массива, используя NSMutableDictionary, как описано OMZ.При этом остается только пробел для одной записи.Это пробел , однако, содержит и индекс, и объект, и есть издержки на преобразование значений индекса в NSNumber s.Таким образом, хотя они могут использоваться в любом месте, * NSArray или NSMutableArray могут быть потери производительности.Это классический компромисс между скоростью и пространством.

См. https://github.com/LavaSlider/DSSparseArray

0 голосов
/ 11 июля 2011

Объект NSArray является статическим (или неизменяемым) в том смысле, что он должен быть заполнен в момент его создания, либо с помощью -initWithObjects, + arrayWithObjects, либо с использованием содержимого уже существующего массива с -initWithArray,и т. д. Вы не можете добавлять объекты позднее.

Существует конкретный изменяемый подкласс (называемый NSMutableArray), который позволяет динамически добавлять и удалять объекты по мере необходимости.Однако, когда вы инициализируете его в пустом состоянии (либо с помощью -initWithCapacity: или + arrayWithCapacity :), то, что вы указываете в качестве начальной длины, является просто подсказкой (массив создается с достаточным объемом памяти для хранения этого количества объектов), однако он можетрасширяться по мере необходимости.Так что да, в этом случае это будет разреженный массив.

Best,

...