Класс NSAutoreleasePool используется для поддержки системы управления памятью с подсчетом ссылок Какао.В пуле автоматического выпуска хранятся объекты, которым при извлечении самого пула отправляется сообщение об освобождении.
В среде с подсчетом ссылок (в отличие от среды, в которой используется сборщик мусора), объект NSAutoreleasePool содержит объекты, которые получилисообщение об автозапуске, и когда оно истощено, оно отправляет сообщение об освобождении каждому из этих объектов.Таким образом, отправка авто-выпуска вместо выпуска объекта продлевает время жизни этого объекта, по крайней мере, до тех пор, пока сам пул не будет очищен (это может быть дольше, если объект впоследствии будет сохранен).Объект может быть помещен в один и тот же пул несколько раз, и в этом случае он получает сообщение о выпуске каждый раз, когда он был помещен в пул.
В среде с подсчетом ссылок Cocoa ожидает, что будет пул авто-выпускавсегда доступен.Если пул недоступен, автоматически выпущенные объекты не освобождаются, и вы теряете память.В этой ситуации ваша программа, как правило, регистрирует подходящие предупреждающие сообщения.
Application Kit создает пул автоматического выпуска в главном потоке в начале каждого цикла цикла событий и сливает его в конце, освобождая тем самымлюбые автоматически выпущенные объекты, сгенерированные во время обработки события.Если вы используете Application Kit, вам, как правило, не нужно создавать свои собственные пулы.Однако, если ваше приложение создает много временных автоматически выпущенных объектов в цикле событий, может быть полезно создать «локальные» пулы автоматического выпуска, чтобы помочь минимизировать пиковый объем памяти.
Вы создаете объект NSAutoreleasePool с помощьюобычные сообщения alloc и init и распоряжаться ими с помощью стока (или release - чтобы понять разницу, см. «Сборка мусора»).Поскольку вы не можете сохранить пул авто-релиза (или его авто-релиз - см. «Сохранение и авто-релиз»), в конечном итоге слив пула приводит к его освобождению.Вы всегда должны сливать пул авто-релиза в том же контексте (вызов метода или функции или тела цикла), в котором он был создан.См. Autorelease Pools для получения более подробной информации.
Каждый поток (включая основной поток) поддерживает свой собственный стек объектов NSAutoreleasePool (см. «Потоки»).По мере создания новых пулов они добавляются на вершину стека.Когда пулы освобождаются, они удаляются из стека.Автоматически освобожденные объекты помещаются в верхний пул автоматического выпуска для текущего потока.Когда поток завершается, он автоматически удаляет все пулы автоматического выпуска, связанные с ним.