Недостаток использования NSMutableArray vs NSArray?
Я использую массив для хранения кэшированных объектов, загруженных из базы данных в моем приложении iPhone, и задавался вопросом: существуют ли существенные недостатки в использовании NSMutableArray, о котором я должен знать?
edit: Я знаю, что NSMutableArray можно изменить, но я ищу конкретные причины (производительность и т.д.), почему вместо этого следует использовать NSArray. Я предполагаю, что будет разница в производительности, но я понятия не имею, значимо это или нет.
Ответы
Ответ 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 обеспечивает гибкость в возможности модификации.