@ itaiferber неверно, как и сообщение в блоге разработчика, на которое он ссылается.
NSAutoreleasePools не , созданный в стеке. Они расположены в куче, как и все другие объекты Какао.
Я думаю, из-за чего возникла путаница в том, что в документации сказано:
Каждый поток (включая основной поток) поддерживает свой собственный стек объектов NSAutoreleasePool (см. «Потоки»). По мере создания новых пулов они добавляются на вершину стека. Когда пулы освобождаются, они удаляются из стека.
"Стек", упоминаемый в документации, - это не стек вызовов , а структура данных стека . Это означает, что если у вас есть «пул авто-релиза 1», а затем создан второй пул авто-релиза, а затем автоматически выпущен объект, объект будет освобожден при сливе второго пула авто-выпуска.
В итоге: вы можете создать пул авто-релизов в одном методе и использовать его в другом, если вы понимаете, как это влияет на память. (Является ли это плохим дизайном - это совсем другой вопрос)
Если в итоге вы не осушите пул, он будет истощен для вас , когда истощится пул родительского автоматического выпуска.
Если вы освобождаете пул автоматического выпуска, который не является вершиной стека, это приводит к освобождению всех (не выпущенных) пулов автоматического выпуска над ним в стеке вместе со всеми их объектами. Если вы не отправите релиз в пул авто-релиза, когда закончите с ним (что-то не рекомендуется), он будет выпущен, когда будет выпущен один из пулов авто-релиза, в который он вложен.
Так что, если ваш стек пула автоматического выпуска выглядит так:
_____
| 1 | <--- most recently allocated pool
|-----|
| 2 |
|-----|
| 3 | <--- least recently allocated pool
-----
И затем вы сливаете бассейн 3, бассейны 2 и 1 также будут автоматически слиты. Я предполагаю, что это то, что происходит в вашем коде. Вы создаете «пул 1», и он автоматически сливается, когда «пул 3» истощается, а затем вы пытаетесь самостоятельно слить пул 1, но он больше не действителен, и вы «пытаетесь вытолкнуть неизвестное». Автоселевой бассейн ".
Эта проблема особенно очевидна, если вы пытаетесь удержать пулы автоматического выпуска в приложении с графическим интерфейсом. В таких приложениях (на основе UIKit или AppKit) цикл выполнения будет создавать и уничтожать пул автоматического выпуска при каждом проходе цикла, что означает, что любой пул автоматического выпуска, который вы создаете во время итерации цикла, будет уничтожен при следующем запуске цикла вокруг.
Для получения более подробной информации об этом см. целый раздел Руководства по программированию управления памятью, посвященный пулам автоматического освобождения.