Вам нужно создать NSAutoreleasePool в блоке в GCD? - PullRequest
73 голосов
/ 10 ноября 2010

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

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

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

1 Ответ

109 голосов
/ 10 ноября 2010

Применяется ли то же правило к блоку который находится внутри Grand Central Отправка очереди и будет запущена на неосновная тема? То есть тебе нужно создать 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 отправка очереди имеют свои собственные пулы автоматического выпуска, они не дают никаких гарантий относительно когда эти бассейны осушены. Если ваше приложение памяти ограниченный, создание собственного пула автоматического выпуска позволяет освободить память для автоматически выпущенных объектов с более регулярными интервалами.

...