Вопрос

Обычно, если вы порождаете фоновую нить или запустите NSOPWARY на NsoPerationQueue, вам необходимо создать NSAuthoreleasePool для этого потока или операции, потому что никто не существует по умолчанию.

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

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

Это было полезно?

Решение

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

Grand Central Dispatch автоматически управляет бассейном автореляции на очередь. Тем не менее, нет никаких гарантий, при этом бассейн будет истощен; Это может быть после обработки одного блока, это может быть после сотен (но, вероятно, не будет).

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


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

Видеть https://developer.apple.com/library/content/documentation/grane/Coneptual/ConcurnencyProgrammingGuide/OpuranceQueues/opergrammingGueues.html#//apple_ref/doc/uid/tp40008091-Ch102-SW1.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top