Ваш код полностью правильный .Не слушайте людей, говорящих вам, чтобы удалить авто-релиз и вручную освободить массив после вызова someMethod:
.
. В 99% случаев использование объекта autorelease'd абсолютно нетнегативное влияние на производительность вашего приложения.Единственное, о чем вы хотите беспокоиться - это циклы.
Шаблон [[[Foo alloc] init] autorelease]
такой же, как и при использовании встроенного вспомогательного метода, такого как [NSString stringWithFormat:...]
.Они оба возвращают автоматически выпущенный объект, но вы, вероятно, не беспокоитесь о производительности последнего.Опять же, беспокойтесь только об автоматическом выпуске в больших циклах, или когда Instruments сообщит вам, что у вас есть проблема.
Использование стиля [[[Foo alloc] init] autorelease]
также сохраняет все управление памятью в одной строке.Если вы привыкнете печатать [[[
, вы не забудете релиз.Если вы копируете и вставляете код или перемещаете код, вы случайно не потеряете соответствующий release
, потому что он все в одной строке.
Также проще просмотреть код, который использует [[[Foo alloc] init] autorelease]
стиль, потому что вам не нужно искать 1020 * дальше по методу, чтобы убедиться в правильности управления памятью.
Итак, с точки зрения читабельности, безопасности и правильности, ваш код абсолютно в порядке.и хорошо.Это относится как к вашему оригинальному фрагменту, так и к последующим действиям, которые вы добавили ниже.Производительность автоматического выпуска становится проблемой только тогда, когда у вас большие циклы.
Ваша проблема с аварийным завершением должна быть вызвана каким-то другим фактором, который не очевиден в опубликованном вами коде.
Я также предлагаю вам прочитать Руководство по программированию управления памятью , если вы этого еще не сделали.По сути, объект autorelease'd гарантированно остается действительным до тех пор, пока не будет освобожден окружающий пул.В вашем случае пул авто-выпусков находится выше в стеке вызовов (возможно, в главном цикле выполнения), поэтому вы можете быть уверены в том, что ваш массив autorelease'd будет оставаться действительным в течение любых ваших вызовов.
Последний пункт.В вашем коде выделения массива также может использоваться вспомогательный конструктор array
:
NSMutableArray *myArray = [NSMutableArray array];
Это даже проще, чище и короче, чем ваш оригинал.