2015-05-28 3 views
2

Я изучаю руководство по управлению памятью, и мне интересно, когда пулы авторекламы сливаются.Когда сливаются бассейны автореферата?

Существует 3 ситуации, которые я нашел: 1 - в main.m, начните с запуска приложения и вытеки на конце, освободив все объекты в памяти. 2 - когда вы явно создаете авторекламу пула вручную и слейте ее

Третий случай - это то, о чем я прошу, и его смущение для меня.

Как я изучил, объекты автореферации, подобные автоматическим переменным в C, которые существуют только в логической области (в теле функции). Поэтому я полагаю, что после каждой функции есть скрытый [pool drain];

Но мне было указано, что это неправильно, как я думал. Apple говорит, что она стекает после «события». Это событие может возникнуть при нажатии кнопки пользователя, например, перезагрузка таблицы.

Но этой информации недостаточно, чтобы увидеть всю картину. Не могли бы вы прояснить для меня, когда ровно бассейн стекает на объекты, например NSArray *arr = [NSArray array];?

+1

Пул автореферата не сливается в конце каждой функции, а каждый раз, когда вы возвращаете управление в цикл запуска. – Rob

+0

@ Что я прошу, когда это произойдет? –

+0

@rob в порядке, это довольно хорошо, но как я могу определить, какой метод точно удаляет пул? Есть ли список методов? Или какие-то критерии? –

ответ

3

Документация не указана при истощении «основного» пула авторезистов, но в целом вы можете предположить, что он слит в конце основного цикла событий приложения.

Вот что происходит в отношении autorelease бассейнов:

  1. autorelease пул создается при запуске приложения.
  2. Когда создается другой пул, он добавляется в верхнюю часть стека пула авторезистов.
  3. Когда autorelease отправляется объекту, он добавляется в пул автозапуска в верхней части стека.
  4. Когда release отправляется в пул авторефератов, он, в свою очередь, отправляет release на любой объект в пуле.

# 4 обычно происходит автоматически (для основного пула авторефератов) в конце основного цикла событий.

Документации NSAutoreleasePool содержит больше информации, в том числе этого соответствующего лакомый:

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

+1

Извините, но это еще далеко не ясно для меня.если я правильно понимаю, основной цикл событий - это основной поток, который начинается, когда запуск и завершение приложения заканчиваются. Я понимаю, что пул авторекламы в основной части - это утечка, когда приложение заканчивается. Но как насчет объектов, которые должны быть выпущены при жизни приложения? Очевидно. приложение не может «удерживать» все объекты в памяти до тех пор, пока оно не закончится, поэтому ему нужно выяснить, когда ему нужно слить другие пулы, иначе у приложения закончится нехватка памяти. Интересно, как и когда они сливают эти бассейны. –

+1

@EvgeniyKleban: основной цикл событий продолжает циклически повторяться в течение всего времени работы приложения (так как он должен обрабатывать события пользовательского интерфейса), поэтому основной пул авторесурсов будет выгружаться многократно за время жизни приложения. – mipadi

+0

Я думал, что есть несколько бассейнов, и у каждого есть некоторые объекты, и в какой-то момент он сливается. Но если есть только 1 пул, и он много раз сливается, все автоматически выпущенные объекты уничтожаются много раз в течение жизни? Это верно? (Остаются только те, у кого есть число выживших> 1) –

Смежные вопросы