Почему release часто вызывается вскоре после использования локальной переменной вместо простого автоматического выпуска - PullRequest
2 голосов
/ 03 мая 2011

Я часто вижу что-то вроде следующего:

UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
  self.navigationItem.rightBarButtonItem = anotherButton;
  [anotherButton release];

, особенно там, где используется локальная переменная, в данном случае «anotherButton», а затем выпускается позже.Это то же самое, что и автоматическое освобождение, когда оно выделяется, и затем убедиться, что оно используется до завершения метода?то есть:

UIBarButtonItem *anotherButton = [[[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)] autorelease];          
  self.navigationItem.rightBarButtonItem = anotherButton;

Я спрашиваю, потому что я вижу, что это было сделано первый раз огромное количество времени, но это менее подвержено ошибкам (для меня), чтобы просто автоматически выпустить его.Это просто вопрос личного стиля или есть различия между этими двумя подходами, за исключением того, что один методически освобождает объект после того, как все сделано с ним, а другой заботится о том, чтобы он был освобожден с самого начала, чтобы никто не случайнозабудь, оба имеют достоинства.

Ответы [ 4 ]

5 голосов
/ 03 мая 2011

С Разумное распределение памяти в Настройка производительности и быстродействия Таблица 7-2 Советы по распределению памяти:

Подсказка

Сократите использование авто-релиза объекты.

Действия для принятия

Объекты, выпущенные с помощью автоматического выпуска метод оставаться в памяти, пока вы явно слить ток автозапуск пула или до следующего время вокруг вашего цикла событий. Всякий раз, когда возможно, избегайте использования авто-релиза метод, когда вы можете вместо этого использовать метод выпуска, чтобы восстановить память занятый объектом сразу . Если Вы должны создать умеренное количество автоматически выпущенные объекты, создать локальный Авто-релиз бассейн и слить его периодически восстанавливать память для эти объекты до следующего события цикл.

2 голосов
/ 03 мая 2011

Когда вы автоматически выпускаете что-то, вы добавляете это в группу объектов, которые будут выпущены в будущем.Это означает, что эти объекты все еще существуют.Поскольку iOS предоставляет ограниченный объем памяти, рекомендуется использовать выпуск вместо автоматического выпуска, когда это возможно.Вы не хотите, чтобы ваша программа вылетала из-за недостатка памяти, потому что у вас много автоматически выпущенных объектов.

1 голос
/ 03 мая 2011

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

В коде, который вы цитируете, разница между ними действительно минимальна.Маловероятно, что anotherButton будет освобожден даже после его освобождения, потому что присвоение self.navigationItem.rightBarButtonItem, вероятно, приведет к сохранению anotherButton.

Лучший аргумент для вызова release как можно скорее, IMO и в этомСитуация в том, что, выпуская anotherButton, вы явно документируете тот факт, что вы закончили с его использованием.Кроме того, статический анализатор будет звонить вам, если вы используете anotherButton после выпуска.Эти два факта могут помочь вам избежать ошибок и просто облегчить понимание вашего кода.

Аргумент в пользу автоматического выпуска в подобной ситуации заключается в том, что его может быть немного легче читать.Я думаю, что есть причина, по которой Apple предоставляет нам все эти удобные методы, такие как + stringWithFormat: - они позволяют вам создавать и использовать нужную строку одним методом, а не тремя.

1 голос
/ 03 мая 2011

Отличный вопрос.Автоматически освобождая, вы задерживаете автоматическое освобождение объектов.Это все нормально, и при этом нужно ожидать ожидаемого поведения, когда вам нужно вернуть что-то из метода, но сохранение этого объекта в памяти дольше, чем необходимо, может оказать влияние на ваше приложение.в этот момент вы освобождаете ресурс, и память может использоваться другим объектом во время выполнения.В Cocos2D стандартной практикой является автоматическое высвобождение почти всего, и кажется, что все работает хорошо, но это все равно меня теряет, и я бы не стал этого делать в обычной практике.

...