Как часто я должен ставить NSAutoreleasePools на место? - PullRequest
1 голос
/ 05 ноября 2010

Привет, я делаю статическую библиотеку с прикосновением какао, и у меня есть эта проблема:

Я запускаю свой проект в симуляторе с помощью инструмента «Утечки», и я придумываю утечки для автоматически выпущенных объектов.

Я точно знаю, что у меня есть хотя бы один NSAutoreleasePool на месте (в моем main() методе), мой вопрос в том, как часто я должен вставлять другие (я разрабатываю для iPhone и iPad если это имеет значение)

ОБНОВЛЕНИЕ: Я понял, что по какой-то причине мой код не выходит из вызова UIApplicationMain() на iOS 4, я просто получаю сигнал SIGKILL, и мой пул авто-выпуска не истощает , Как я могу это исправить (я имею в виду приложение, получающее SIGKILL)

Спасибо

Ответы [ 3 ]

2 голосов
/ 05 ноября 2010

NSAutoreleasePool требуется, когда вы запускаете что-либо в фоновом потоке, поэтому, если ваши функции могут быть запущены в фоновом режиме, вам необходимо создать в них пул автоматического выпуска:

- (void) willRunInBackground{
   NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
   ...
   [pool drain];
}

Вторая ситуациягде NSAutoreleasePool будет полезен, когда вы создаете много автоматически выпущенных объектов в цикле - чтобы избежать зависания большого количества автоматически выпущенных объектов, вы можете создавать и сливать пул автоматического выпуска при итерации цикла (как упоминал Джо).

Но у вас утечки памятивероятно, вызваны 1-й причиной - каждый поток должен иметь свой собственный NSAutoreleasePool для обработки автоматически выпущенных объектов.

1 голос
/ 06 ноября 2010

Тот факт, что вы автоматически высвобождаете объекты, сам по себе не предотвращает утечку памяти.Поскольку вы не видите в консоли сообщений о том, что ваши объекты автоматически высвобождаются за пределами пула, это означает, что проблема не в том, что они не помещаются в пул.

Вы не должны бытьправильное управление вашим счетом удержания.Помните, что все вызовы -alloc и -copy должны быть сбалансированы вызовами -release или -autorelease.Возможно, вы не выпускаете переменные-члены в методе dealloc класса.Начните с использования Инструментов, чтобы найти, где вы размещаете / копируете свои объекты, затем посмотрите на каждое место, которое вы сохраняете, и отпустите их, чтобы убедиться, что количество сохраненных объектов каждого объекта сбалансировано.

0 голосов
/ 05 ноября 2010

Согласно стандартным практикам видео WWDC, хороший цикл с множеством переменных переменных - это хорошее место для того, чтобы его поставить. Запустите его перед циклом, все в цикле, которое автоматически освобождено, должно идти в этот пул, а затем сливать его.

...