NSMutableArray-init по сравнению с +arrayWithCapacity:

Я следую метод aarojensen , но помещаю его в меню файла (щелчок правой кнопкой по меню, и выбор настраивают). Тогда Alt-F-B закрывает всех кроме тока.

10
задан Joshua Nozzi 29 August 2013 в 19:31
поделиться

4 ответа

Первый создает изменяемый массив без указания емкости. Это заставляет массив увеличиваться при добавлении элементов. Внутренне это, вероятно, сильно оптимизировано для создания «блоков за раз», но по-прежнему необходимо увеличивать массив и выделять больше места при добавлении элементов.

Второй дает массиву подсказку (вам, вероятно, понадобится » столько "места"), чтобы избежать накладных расходов, связанных с увеличением массива при добавлении известного числа объектов. Конечно, при необходимости он все равно будет увеличиваться (как если бы вы не указали емкость). Вам следует использовать этот подход, если вы заранее знаете счет. Это быстрее при большом количестве.

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

Кроме того, вы не автоматически освобождаете B (как вы закомментировали), потому что вы этого не сделали. t создать изменяемый массив с помощью init - вы использовали удобный метод, который сделал это сам, а это значит, что вы не несете ответственности за его выпуск. Как я уже упоминал в комментарии к другому ответу на ваш вопрос, вы также можете создать массив с помощью:

[[NSMutableArray alloc] initWithCapacity: capacity];

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

Однако помните: сначала измерьте, а затем оптимизируйте, если необходимо.

28
ответ дан 3 December 2019 в 15:06
поделиться

В первом примере вы должны управлять памятью массива, поскольку вы создаете его с помощью + alloc и -init (вот почему вам необходимо отправить ему -autorelease ).

Во втором примере вам не нужно управлять памятью массива, поскольку он возвращается вам автоматически освобожденным (потому что вы создали его с помощью удобный способ). Кроме того, поскольку вы указываете желаемый размер массива заранее, он, вероятно, будет более эффективным.

Если вы хотите вернуть автоматически выпущенный массив, то второй вариант, вероятно, будет более предпочтительным, поскольку + arrayWithCapacity: вернет уже автоматически выпущенный массив. Кроме того, поскольку возвращенный вам массив уже автоматически выпущен, вам не нужно отправлять ему -autorelease самостоятельно.

1
ответ дан 3 December 2019 в 15:06
поделиться

Изменяемым объектам по-прежнему необходимо выделять пространство, чтобы выделить объем по умолчанию для, скажем, 10 объектов. Если вы добавите 11-й, изменяемый массив должен будет выделить новую память, скопировать элементы в новую память и освободить старую память.

Обычно это происходит так быстро, что вы даже не заметите, но это может замедлить его вниз. Создание изменяемого массива с размером изначально создает массив указанного размера, поэтому, будем надеяться, будет меньше изменение размера.

1
ответ дан 3 December 2019 в 15:06
поделиться

Я бы использовал B:

Плюсы, которые я вижу с этим, следующие:

  • Размер массива не нужно будет изменять по мере его увеличения
  • arrayWithCapacity: автоматически выпускается для вы, так что вам не обязательно, это улучшает читаемость кода imho

Надеюсь, это поможет.

0
ответ дан 3 December 2019 в 15:06
поделиться