Вам нужно создать NSAutoreleasePool в блоке в GCD?

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

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

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

Ответ 1

Соответствует ли то же правило блоку который размещен в Центральном центре Очередь отправки и будет запущена на не основной поток? То есть, вам нужно создать NSAutoreleasePool внутри каждый блок вы отправляете на что угодно кроме основной очереди?

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

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


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

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

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