Objective-c NSArray init против initWithCapacity: 0 - PullRequest
18 голосов
/ 21 мая 2011

Do

[[NSMutableArray alloc] init];

и

[[NSMutableArray alloc] initWithCapacity:0];

компилируются в одно и то же?

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

1 Ответ

18 голосов
/ 21 мая 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...