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

Недостаток использования NSMutableArray vs NSArray?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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