Você precisa criar um NSAutoreleasePool dentro de um bloco no GCD?

Normalmente, se você gerar um thread de segundo plano ou executar um NSOperation em um NSOperationQueue, será necessário criar um NSAutoreleasePool para esse segmento ou operação, pois nenhum existe por padrão.

A mesma regra se aplica a um bloco que é colocado em uma fila do Grand Central Dispatch e será executado em um thread não principal? Ou seja, você precisa criar um NSAutoreleasePool dentro de cada bloco que você despacha para algo diferente da fila principal?

Nos meus testes limitados, não vejo os avisos do console para objects liberados automaticamente que você normalmente vê com threads de segundo plano ou NSOperations. No entanto, não consigo encontrar documentação definitiva sobre isso, então eu queria saber se alguém poderia apontar onde isso é indicado.

A mesma regra se aplica a um bloco que é colocado em uma fila do Grand Central Dispatch e será executado em um thread não principal? Ou seja, você precisa criar um NSAutoreleasePool dentro de cada bloco que você despacha para algo diferente da fila principal?

O despacho do Grand Central gerenciará automaticamente um pool de autorelease por fila. No entanto, não há garantias de quando a piscina será drenada; pode ser depois que um bloco é processado, pode ser depois de centenas (mas provavelmente não será).

Então, se você está apenas alocando alguns objects, não se preocupe com isso. No entanto, se você estiver alocando um número significativo de objects (e desde que esteja direcionando um ambiente com restrição de memory), deverá criar e drenar conjuntos.


A documentação foi atualizada.

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

Se o seu bloco criar mais do que alguns objects Objective-C, você poderá include partes do código do seu bloco em um bloco @autorelease para manipular o gerenciamento de memory desses objects. Embora as filas de dispatch do GCD tenham seus próprios pools autorelease, elas não garantem quando esses pools são drenados. Se o seu aplicativo for restrito por memory, criar seu próprio pool autorelease permite liberar a memory para objects liberados automaticamente em intervalos mais regulares.