Недостаток использования NSMutableArray против NSArray? - PullRequest
33 голосов
/ 17 ноября 2009

Я использую массив для хранения кэшированных объектов, загруженных из базы данных, в моем приложении для iPhone, и мне было интересно: есть ли существенные недостатки использования NSMutableArray, о которых мне следует знать?

edit: я знаю, что NSMutableArray можно изменить, но я ищу конкретные причины (производительность и т. Д.), Почему вместо этого следует использовать NSArray. Я предполагаю, что будет разница в производительности, но я не знаю, значительна она или нет.

Ответы [ 5 ]

49 голосов
/ 17 ноября 2009

Если вы загружаете объекты из базы данных и знаете точно , сколько у вас объектов, вы, вероятно, получите максимальную производительность от метода NSMutableArray s arrayWithCapacity: и добавите в него объекты до полного заполнения, поэтому он выделяет всю память сразу, если может.

За кулисами, они в тайне одно и то же - NSArray и NSMutableArray оба реализованы с CFArray s через бесплатное соединение (a CFMutableArrayRef и CFArrayRef являются typedef's то же самое, __CFArray *) *

NSArray и NSMutableArray должны иметь одинаковую производительность / сложность (время доступа составляет O (lg N) в худшем случае и O (1) в лучшем случае), и единственная разница состоит в том, сколько памяти будут использовать два объекта - NSArray имеет фиксированный лимит, в то время как NSMutableArray может использовать столько свободного места, сколько у вас есть.

Комментарии в CFArray.h содержат гораздо более подробную информацию об этом.

*: Как указывает Catfish_Man ниже, это уже не так.

25 голосов
/ 17 ноября 2009

Разница в производительности при использовании массива NSArray и массива NSMutable возникает главным образом при использовании API, который хочет скопировать массив. если вы отправляете -copy в неизменяемый массив, он просто увеличивает счетчик хранения, но отправка -copy в изменяемый массив выделяет кучу памяти.

14 голосов
/ 17 ноября 2009

Кроме того, NSMutableArray не является потокобезопасным, в то время как NSArray - (то же самое со всеми изменяемыми и неизменяемыми объектами). Это может быть огромной проблемой, если вы используете многопоточность.

9 голосов
/ 13 октября 2010

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

Если NSMutableArray не выставлен вне объекта, это не проблема.

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

Это , вероятно, по той же причине, по которой NSDictionary копирует свои ключи, а не просто сохраняет их: нужно быть уверенным, что они не будут мутировать, и копирование - единственный способ гарантировать, что .

2 голосов
/ 17 ноября 2009

Вы не можете изменить NSArray после его создания. Если вам нужно добавить / удалить объекты из вашего массива, тогда вы будете использовать NSMutableArray - вариантов не так много. Я предполагаю, что NSArray оптимизирован для операций с фиксированным массивом. Изменяемый массив позволяет гибко изменяться.

...