arrayWithCapacity: к нему уже применено автоматическое освобождение.
initWithCapacity: явно сохраняется, и вам нужно будет освободить его самостоятельно. Так как вы обычно называете его как [[A alloc] init ...], это вызовет лампочку «Мне нужно управлять памятью для этого», другие подобные магические слова, кроме «alloc», являются «new» и «copy» как Вы читаете в руководстве по управлению памятью. Но из твоего вопроса, похоже, ты хорошо понимаешь принципы этого.
Вы правы в том, что вы должны держать свой объем памяти управляемым и низким, но это не значит, что вам всегда нужно делать явные инициализацию / выпуск. Как говорит Ник, один из вариантов использования фабричных методов автоматического выпуска - это когда вы передаете их как параметры.
Другим примером является то, что когда вы добавляете что-то в коллекцию, такую как NSDictionary или NSArray, это «что-то» может быть создано с помощью метода фабрики автоматического выпуска, поскольку коллекция «перехватывает» его сохранение. (Вещи сохраняются при добавлении в коллекцию и освобождаются при удалении.)
Вы можете утверждать, что
Blah *blah = [Blah blahWithSomething];
[myMutableArray addObject:blah];
просто чище, чем
Blah *blah = [[Blah alloc] initWithSomething];
[myMutableArray addObject:blah];
[blah release];
В первом случае вам вообще не нужно беспокоиться о выпускном звонке. Недостатком является то, что когда вы делаете это много раз в одном и том же цикле выполнения, объем памяти в первом случае больше, если это объект временного / одноразового массива, который исчезает в конце цикла выполнения. Но если это небольшой объект, не выполненный в цикле и сохраненный в течение более длительного времени, как это обычно бывает, их следы остаются теми же.