2011-01-16 5 views
0

Знаете ли вы, что произойдет, если я сохраню автореализованный объект? Будет ли он выпущен или сохраняется выигрыш?iPhone - Что произойдет, если сохранить после автореферата?

+2

Простейший способ узнать это попробовать. изменять свой код, создавать и запускать. Расскажите нам свои выводы. %) –

ответ

7

Вы знаете, что произойдет, если я сохраняю autoreleased объект? Будет ли это выпущено или сохраняется выигрыш?

retain «побеждает», но, думая об этом, он потерпел неудачу.

Сохранение и освобождение - это просто механизмы, посредством которых вы увеличиваете или уменьшаете количество удержаний объекта. Autorelease - это просто отсроченный релиз; Не больше, не меньше.

Если вы сохранили автореализованный объект, вы увеличиваете счетчик удержания СЕЙЧАС, пока количество удержания будет уменьшено. Это происходит все время; [NSString stringWithFormat: @"...."] возвращает строку с автореализацией, которую вы retain, если вы хотите, чтобы она придерживалась более [чаще всего] текущего прохождения цикла событий.

2

Если вы хотите сохранить свою переменную, вам необходимо , чтобы сохранить ее. Например:

myButton = [[UIButton buttonWithType:...] retain]; 

Метод buttonWithType: возвращает UIButton, который был инстанцированный с autorelease. Он позаботится о том, чтобы освободить себя (если можно так выразиться), когда это необходимо.

2

Сохранение победит. Это очень распространено, и это исключенная практика.

Обычно удобные методы возвращают autoreleased объекты, такие как

[NSString stringWithFormat:@""]; 

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

Помните, что автореализаторы произойдут в конце текущего системного сообщения.

Из приведенной ниже статьи: «для каждого сообщения, которое обрабатывается системой, и объекты в пуле создаются автоматически, после того, как обработка завершена».

Некоторые большие объяснения этого можно найти здесь:

http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/7295-getters-setters-properties-newbie.html

+0

Довольно хороший ответ, за исключением того, что автореферат (обязательно) не происходит при завершении текущего метода. Автореализованные объекты освобождаются только тогда, когда пул сливается, и это обычно происходит только после каждой поездки через цикл запуска. У ваших автореализованных объектов есть потенциал для долгого использования. – kubi

+0

@kubi: Из статьи, опубликованной мной, «создается пул авторесурсов для каждого сообщения, которое обрабатывается системой, а объекты в пуле автоматически освобождаются после завершения обработки этого сообщения». Я не имел в виду текущее сообщение, я имел в виду текущее системное сообщение. Я исправлю свой пост. –

+0

«Текущее системное сообщение» концептуально корректно, но более точный термин - «текущее событие», обычно «текущее событие, обработанное runloop».Обратите внимание, что очереди GCD также управляют пулом автозапуска в очереди (или более, в некоторых случаях), но дренаж гораздо менее детерминирован, чем цикл запуска. – bbum

Смежные вопросы