Moet je een NSAutoreleasePool maken binnen een blok in GCD?

Normaal gesproken, als u een achtergrondthread spawnt of een NSOperation uitvoert op een NSOperationQueue, moet u een NSAutoreleasePool voor die thread of bewerking maken, omdat er standaard geen bestaat.

Geldt dezelfde regel voor een blok dat in een Grand Central Dispatch-wachtrij wordt geplaatst en op een niet-hoofdthread wordt uitgevoerd? Dat wil zeggen, moet u een NSAutoreleasePool maken binnen elk blok dat u naar iets anders verzendt dan de hoofdwachtrij?

Tijdens mijn beperkte tests zie ik geen consolewaarschuwingen voor automatisch vrijgegeven objecten die je normaal gesproken ziet bij achtergrondthreads of NSOperations. Ik kan hier echter geen definitieve documentatie over vinden, dus ik vroeg me af of iemand kan aangeven waar dit wordt vermeld.


Antwoord 1, autoriteit 100%

Geldt dezelfde regel voor een blokkering?
dat is geplaatst in een Grand Central
Verzendwachtrij en wordt uitgevoerd op a
niet-hoofddraad? Dat wil zeggen, heb je nodig?
om een ​​NSAutoreleasePool te maken binnen
elk blok dat je naar iets verzendt
anders dan de hoofdwachtrij?

Grand Central Dispatch beheert automatisch een autorelease-pool per wachtrij. Er zijn echter geen garanties over wanneer het zwembad zal worden geleegd; het kan zijn nadat één blok is verwerkt, het kan na honderden zijn (maar waarschijnlijk niet).

Dus, maak je geen zorgen als je maar een paar objecten toewijst. Als u echter een aanzienlijk aantal objecten toewijst (en aangezien u zich richt op een omgeving met beperkt geheugen), moet u pools maken en leegmaken.


De documentatie is bijgewerkt.

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

Als uw blok meer dan een paar Objective-C-objecten maakt, kunt u:
delen van de code van uw blok wilt insluiten in een @autorelease-blok om
het geheugenbeheer voor die objecten afhandelen. Hoewel GCD-verzending
wachtrijen hebben hun eigen autorelease-pools, ze geven geen garanties over:
wanneer die zwembaden worden leeggepompt. Als uw toepassing geheugen is
beperkt, door uw eigen autorelease-pool te maken, kunt u vrijmaken
het geheugen voor automatisch vrijgegeven objecten met meer regelmatige tussenpozen.

Other episodes