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

Objective-c NSArray init и initWithCapacity: 0

Do

[[NSMutableArray alloc] init];

и

[[NSMutableArray alloc] initWithCapacity:0];

скомпилировать то же самое?

Если они отличаются, то как и какая форма "лучше" с точки зрения производительности памяти и времени выполнения?

4b9b3361

Ответ 1

Нет, они не будут вести себя одинаково. init создаст массив с неизвестной, но, скорее всего, ненулевой емкостью - независимо от того, что авторы решили, было разумным дефолтом для большинства ситуаций. initWithCapacity:0 запросит массив с абсолютно свободным пространством. Это означает, что это реализация NSMutableArray: она может не допускать емкость 0 и вести себя точно как init, или она может не сразу выделить что-либо и вместо этого выделить некоторую сумму (то же, что и init, возможно, или, может быть, нет), когда вы в первую очередь нуждаетесь в нем.

Что будет выполнять "лучше" полностью зависит от того, как вы ожидаете использовать массив. -init говорит: "У меня нет ожиданий для этого массива, я либо добавлю, либо удалю из него много, или он, вероятно, будет довольно маленьким". -initWithCapacity: говорит: "Я ожидаю, что в обозримом будущем этот массив будет иметь не больше, чем это много элементов".

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

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