Зачем использовать пул Autorelease? - PullRequest
28 голосов
/ 18 июня 2011

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

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

Тогда почему и в каких условиях мы должны использовать автоматическое освобождение?

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

Пожалуйста, убери мою путаницу.Thanx.

1 Ответ

20 голосов
/ 18 июня 2011

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

Избегать автозапуска - плохой совет, у монеты есть две стороны.Использование объектов autorelease'd несет определенные накладные расходы (хотя в большинстве сценариев они незначительны), которых следует избегать, когда это возможно.Особенно в тех случаях, когда существует несколько выходов из метода или может возникнуть исключение, автоматическое освобождение помогает избежать утечек памяти и делает код чище.

Имейте в виду, что это означает, что ничто в этом потоке не может использовать авто-выпуск, включая любые фреймворки, которые вы можете вызвать.Есть ситуации, когда это так, например, в классическом сценарии производитель / потребитель.У вас есть производитель, который создает объекты, отправляет их в runloop основных потоков и, следовательно, может зарегистрировать их в основных потоках autoReleasepool.

В общем, я бы не рекомендовал создавать поток, в котором выполняется значительная работа (помимо простых длительных вычислений) без автоматического повторного пула.

...