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


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

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

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

1 72

1 ответ:

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

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

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


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

посмотреть https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

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