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