2010-11-10 2 views
73

Обычно, если вы создаете фоновый поток или запускаете NSOperation в NSOperationQueue, вам нужно создать NSAutoreleasePool для этого потока или операции, поскольку по умолчанию не существует ни одного.Вам нужно создать NSAutoreleasePool внутри блока в GCD?

Соответствует ли это одному и тому же правилу блоку, помещенному в очередь Grand Central Dispatch, и будет запускаться в не основной теме? То есть вам нужно создать NSAutoreleasePool в каждом блоке, который вы отправляете на что-либо другое, кроме основной очереди?

В моем ограниченном тестировании я не вижу предупреждений консоли для объектов с автореализацией, которые вы обычно видите с фоновыми потоками или NSOperations. Тем не менее, я не могу найти окончательную документацию по этому поводу, поэтому мне было интересно, может ли кто-нибудь указать, где это указано.

+0

Из ответа разместил @Gustavo Ambrozio, который был удален, [документация здесь] (http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues. html # // apple_ref/doc/uid/TP40008091-CH102-SW17), если заинтересованные зрители заинтересованы. – iDev

ответ

107

Применим ли то же самое правило к блоку , который находится в очереди Grand Central диспетчерской и будет выполняться на неосновного потоке? То есть, вам нужно , чтобы создать NSAutoreleasePool в пределах каждого блока, который вы отправляете на что-либо кроме главной очереди?

Grand central dispatch автоматически управляет пулом автозапуска в очереди. Однако нет никаких гарантий относительно того, когда пул будет истощен; это может быть после обработки одного блока, это может быть после сотен (но, вероятно, не будет).

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


Документация обновлена.

См https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

Если ваш блок создает более чем несколько объектов Objective-C, вы можете хотите вложить части кода вашего блока в блоке @autorelease для обрабатывать управление памятью для тех, объекты. Хотя очереди GCD имеют свои собственные пулы авторефератов, они не дают никаких гарантий относительно , когда эти бассейны сливаются. Если ваше приложение является оператором памяти , создание собственного пула автозапуска позволяет вам освободить память для объектов с автореализацией через более регулярные промежутки времени.

+3

+1 это в документации в любом месте? –

+6

Непонятно. Ошибка в документации (). – bbum

+3

Отлично. Спасибо за разъяснения. –

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