Нужно разъяснение по NSAutoreleasePool - PullRequest
3 голосов
/ 02 сентября 2011

Всякий раз, когда мы вызываем autorelease метод, его объект собирается на NSAutoreleasePool.Когда пул очищается, он отправляет релиз всем объектам в пуле.

Мой вопрос:
В основной функции есть один NSAutoreleasePool.Я хочу знать это;когда мы вызываем метод autorelease, куда он отправляет объект?Я имею в виду;он отправляет объект на NSAutoreleasePool, который находится в основной функции (или) где-нибудь?

Заранее спасибо.

1 Ответ

8 голосов
/ 02 сентября 2011

На самом деле есть стек авто-релизных пулов. Всякий раз, когда вы делаете [[NSAutoreleasePool alloc] init], этот вновь созданный пул автоматически помещается поверх стека пулов с автоматическим выпуском. Вы можете создавать свои собственные пулы, когда вам это нужно.

Если быть более точным: в каждом потоке есть стек пусков автоматического выпуска . Поэтому всякий раз, когда вы создаете поток (например, с [foo performSelectorInBackground:@selector(bar) withObject:baz]), самое первое, что вам нужно сделать, это создать пул, иначе утечка ваших объектов (это создает печально известные сообщения, такие как "NSAutoreleaseNoPool (): Object 0xd819d0 класса NSCFString автоматически выпущен без пула на месте - просто "утечка" и является очень часто задаваемым вопросом здесь на SO ).

Когда вы вызываете autorelease, объект регистрируется в самом верхнем пуле автоматического выпуска текущего потока (то есть: тот, который был создан последним в этом потоке). Основной цикл выполнения имеет свой собственный пул автоматического выпуска, который очищается при каждой итерации цикла выполнения (AFAIK). Пул из main.m предназначен для перехвата любых объектов, которые, например, могут быть сгенерированы изнутри Cocoa Touch до того, как он создаст пул автоматического выпуска цикла выполнения.

Редактировать : Для получения дополнительной информации за кадром см. Mike Ash's "Let's Build NSAutoreleasePool"

...