Концептуальный вопрос о NSAutoreleasePools - PullRequest
1 голос
/ 05 июня 2010

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

if (pool) {
    // Release & drain the current pool to free the memory.
    [pool release];
}

// Create a new pool.
pool = [[NSAutoreleasePool alloc] init];

Единственные проблемы, которые я могу себе представить:

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

2) Очевидно, что это не так эффективно, потому что пул может быть освобожден, если в нем ничего нет. Аналогичным образом, в 10-секундном промежутке многие объекты могут быть автоматически освобождены, что приведет к значительному росту пула.

Тем не менее, приведенное выше решение кажется довольно подходящим для небольших и простых проектов. Почему никто не использует это? Какова лучшая практика использования NSAutoreleasePools?

Ответы [ 2 ]

3 голосов
/ 05 июня 2010

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

0 голосов
/ 05 июня 2010

NSAutoreleasePool всегда является локальным потоком.

Пул будет автоматически очищаться при каждом такте цикла выполнения. Между 10 секундами, когда ваш NSTimer срабатывает, уже прошло более сотен тиков, поэтому пул очищался сотни раз.

...