NSAutoreleasePool
NSAutoreleasePool
класс используется для поддержки считаемой на ссылку системы управления памятью Какао. Пул автовыпуска хранит объекты, отправляющиеся a release
обменивайтесь сообщениями, когда будет истощен сам пул.
В считаемой на ссылку среде (в противоположность той, использующей сборку «мусора»), NSAutoreleasePool
объект содержит объекты, получившие autorelease
обменивайтесь сообщениями и, когда истощено это отправляет a release
обменивайтесь сообщениями к каждому из тех объектов. Таким образом, отправка autorelease
вместо release
к объекту расширяет время жизни того объекта, по крайней мере, пока сам пул не истощен (это может быть более длинно, если объект впоследствии сохраняется). Объект может несколько раз помещаться в тот же пул, когда это получает a release
сообщение в течение каждого раза это было помещено в пул.
В считаемой среде ссылки Какао ожидает там быть пулом автовыпуска, всегда доступным. Если пул не доступен, автовыпущенные объекты не становятся выпущенными, и Вы пропускаете память. В этой ситуации Ваша программа будет обычно регистрировать подходящие предупреждающие сообщения.
Набор Приложения создает пул автовыпуска на основном потоке в начале каждого цикла цикла событий и истощает его в конце, таким образом выпуская любые автовыпущенные объекты, сгенерированные при обработке события. При использовании Набора Приложения Вы поэтому обычно не должны создавать свои собственные пулы. Если Ваше приложение создает много временных автовыпущенных объектов в цикле событий, однако, это может быть выгодно для создания «локальных» пулов автовыпуска, чтобы помочь минимизировать пиковый объем потребляемой памяти.
Вы создаете NSAutoreleasePool
объект с обычным alloc
и init
сообщения и избавляются от него с drain
(или release
— для понимания различия посмотрите Сборку «мусора»). Так как Вы не можете сохранить пул автовыпуска (или автовыпустить его — посмотрите retain
и autorelease
), дренаж пула в конечном счете имеет эффект освобождения его. Необходимо всегда истощать пул автовыпуска в том же контексте (вызов метода или функции или организации цикла), что это создавалось. Дополнительную информацию см. Используя Блоки Пула Автовыпуска.
Каждый поток (включая основной поток) поддерживает свой собственный штабель NSAutoreleasePool
объекты (см. Потоки). Поскольку новые пулы создаются, они добавляются к вершине штабеля. Когда пулы освобождены, они удалены из штабеля. Автовыпущенные объекты помещаются в главный пул автовыпуска для текущего потока. Когда поток завершается, он автоматически истощает все пулы автовыпуска, связанные с собой.
Потоки
При совершении звонков Какао за пределами основного потока Набора Приложения — например, если Вы создаете приложение Только для основы или если Вы отсоединяете поток — необходимо создать собственный пул автовыпуска.
Если Ваше приложение или поток долгосрочны и потенциально генерируют много автовыпущенных объектов, необходимо периодически истощать и создавать пулы автовыпуска (как Набор Приложения, делает на основном потоке); иначе, автовыпущенные объекты накапливаются, и Ваш объем потребляемой памяти растет. Если, однако, Ваш отдельный поток не выполняет вызовы Какао, Вы не должны создавать пул автовыпуска.
Сборка «мусора»
В собравшей «мусор» среде нет никакой потребности в пулах автовыпуска. Можно, однако, записать платформу, разработанную для работы и в собравшей «мусор» и в считаемой на ссылку среде. В этом случае можно использовать пулы автовыпуска, чтобы подсказать коллектору, что набор может быть надлежащим. В собравшей «мусор» среде, отправляя a drain
обменивайтесь сообщениями к триггерной сборке «мусора» пула если необходимый; release
, однако, нет. В считаемой на ссылку среде, drain
имеет тот же эффект как release
. Как правило, поэтому необходимо использовать drain
вместо release
.
Оператор импорта
Не применимый
Objective C
@import Foundation;
Доступность
Доступный в OS X v10.0 и позже.
-
Выпуски и популярность получатель.
Объявление
Objective C
- (void)release
Обсуждение
В считаемой на ссылку среде, так как не может быть сохранен пул автовыпуска (см.
retain
), этот метод заставляет получатель быть освобожденным. Когда пул автовыпуска освобожден, он отправляет arelease
обменивайтесь сообщениями ко всем его автовыпущенным объектам. Если объект добавляется несколько раз к тому же пулу, когда пул освобожден, это получает arelease
сообщение в течение каждого раза это было добавлено.В собравшей «мусор» среде этот метод нет.
Специальные замечания
Необходимо обычно использовать
drain
вместоrelease
.См. также
-
В считаемой на ссылку среде, выпусках и выталкивает получатель; в собравшей «мусор» среде триггерная сборка «мусора», если память выделила начиная с последнего набора, больше, чем текущий порог.
Объявление
Objective C
- (void)drain
Обсуждение
В считаемой на ссылку среде этот метод ведет себя то же как
release
. Так как пул автовыпуска не может быть сохранен (см.retain
), это поэтому заставляет получатель быть освобожденным. Когда пул автовыпуска освобожден, он отправляет arelease
обменивайтесь сообщениями ко всем его автовыпущенным объектам. Если объект добавляется несколько раз к тому же пулу, когда пул освобожден, это получает arelease
сообщение в течение каждого раза это было добавлено.Специальные замечания
В собравшей «мусор» среде,
release
не, поэтому если Вы не хотите давать коллектору подсказку, важно использоватьdrain
в любом коде, который может быть скомпилирован для собравшей «мусор» среды.Оператор импорта
Objective C
@import Foundation;
Доступность
Доступный в OS X v10.4 и позже.
-
Повышает исключение.
Объявление
Objective C
- (id)autorelease
Возвращаемое значение
self
.Обсуждение
В считаемой на ссылку среде этот метод повышает исключение.
-
Повышает исключение.
Объявление
Objective C
- (id)retain
Возвращаемое значение
self
.Обсуждение
В считаемой на ссылку среде этот метод повышает исключение.
-
Добавляет данный объект к активному пулу автовыпуска в текущем потоке.
Объявление
Objective C
+ (void)addObject:(id)
object
Параметры
object
Объект добавить к активному автовыпуску объединяет в текущем потоке.
Обсуждение
Тот же объект может добавляться несколько раз к активному пулу и, когда пул будет освобожден, это получит a
release
сообщение в течение каждого раза это было добавлено.Обычно Вы не вызываете этот метод непосредственно — Вы отправляете
autorelease
кobject
вместо этого.Оператор импорта
Objective C
@import Foundation;
Доступность
Доступный в OS X v10.0 и позже.
См. также
-
Добавляет данный объект к получателю
Объявление
Objective C
- (void)addObject:(id)
object
Параметры
object
Объект добавить к получателю.
Обсуждение
Тот же объект может несколько раз добавляться к тому же пулу; когда пул будет освобожден, объект получит a
release
сообщение в течение каждого раза это было добавлено.Обычно Вы не вызываете этот метод непосредственно — Вы отправляете
autorelease
кobject
вместо этого.Оператор импорта
Objective C
@import Foundation;
Доступность
Доступный в OS X v10.0 и позже.
См. также