В Objective-C, если addObjectAtIndex вызывается для построения массива, будет ли вызываться initWithCapacity?
В книге я вижу код:
words = [[NSMutableArray alloc] initWithCapacity:[masterWordList count]];
и скажем [masterWordList count]
равно 15. А затем код собрал массив, используя цикл 10 раз:
[words addObject:[masterWordList objectAtIndex:randomNum]];
интересно, почему words
должен быть initWithCapacity
... а до 15 слотов? Разве это не может быть 10 или 11 (если в конце нужен ноль... а также, не будет addObject
автоматически увеличивать размер массива? Я пытался с помощью init
вместо initWithCapacity
и код работал тоже. Таким образом, код в книге может быть упрощен до init
?
2 ответа
initWithCapacity:
просто дает инициализатору класса "подсказку" относительно возможного размера массива. Таким образом, он может выделить достаточно места заранее, если вы знаете, что он вам понадобится. С помощью initWithCapacity:
теоретически может обеспечить лучшую производительность, потому что это может означать, что массив не должен перераспределять память (внутренне), когда вы добавляете к нему объекты (я не знаю, действительно ли он делает это в текущей реализации, но это возможно). Как вы уже догадались, это только подсказка и использование initWithCapacity:
совершенно необязательно. Просто потому, что вы дали initWithCapacity:
определенный размер не означает, что ваш массив не может расти, чтобы содержать больше элементов, чем это. Также звоню init
вместо этого будет работать просто отлично.
Интересно, почему слова должны быть initWithCapacity... и до 15 слотов?
По факту, initWithCapacity:
как правило, не нужно вообще. Это может или не может зарезервировать пространство полезным способом. Насколько я понимаю, это что-то вроде исторического придатка.
Разве это не может быть 10 или 11 (если
nil
нужен в конце...)
Это может быть 10. Как уже упоминалось в вашем другом вопросе, nil
не является частью массива. Это просто дозорное значение для самого вызова метода создания - это не объект и не становится членом коллекции.
также не будет
addObject:
автоматически увеличивать размер массива?
Да, это будет; Вы можете создать изменяемый массив без указания начального размера, и он будет увеличиваться по мере необходимости.
Так можно ли упростить код в книге, чтобы
init
?
Да.