Sie benötigen einen NSAutoreleasePool innerhalb eines Blocks in GCD zu schaffen?
-
30-09-2019 - |
Frage
Normalerweise, wenn Sie einen Hintergrund-Thread laichen oder eine NSOperation auf einem NSOperationQueue laufen müssen Sie ein NSAutoreleasePool für diesen Thread oder den Betrieb erstellen, da keine standardmäßig vorhanden ist.
Ist die gleiche Regel auf einen Block, die während eines Grand Central Dispatch-Warteschlange gestellt wird, und wird auf einem Nicht-Haupt-Thread ausgeführt werden? Das heißt, brauchen Sie in jedem Block Sie eine NSAutoreleasePool erstellen andere als die Haupt-Warteschlange etwas versenden?
In meinem begrenzten Test, ich habe nicht die Konsole Warnungen für Autoreleased Objekte sieht, dass Sie in der Regel mit Hintergrund-Threads oder NSOperations sehen. Allerdings kann ich nicht definitiv Dokumentation zu diesem Thema zu finden scheinen, so dass ich mich gefragt, ob jemand darauf hinweisen könnte, wo dies angegeben ist.
Lösung
Gilt die gleiche Regel auf einen Block die innerhalb eines Grand Central platziert Absende-Warteschlange und wird auf einem ausgeführt werden Nicht-Haupt-Thread? Das heißt, Sie braucht eine NSAutoreleasePool zu schaffen, in jeder Block, den Sie etwas versenden andere als die Haupt-Warteschlange?
Grand Central Dispatch wird einen Autofreigabepool pro Warteschlange automatisch verwalten. Allerdings gibt es keine Garantien, wann der Pool entleert werden; es sein kann, nach einem Block verarbeitet wird, kann es sein, nach Hunderte (aber wahrscheinlich nicht sein).
Also, wenn Sie nur ein paar Objekte Zuteilung, keine Sorge darüber. Wenn Sie jedoch eine erhebliche Anzahl von Objekten Zuweisen (und da Sie einen Speicher eingeschränkte Umgebung sind Targeting), dann sollten Sie erschaffen und Entleeren Pools.
Die Dokumentation wird aktualisiert.
Wenn Ihr Block mehr als ein paar Objective-C-Objekte erstellt werden, können Sie wollen Teile des Blocks Code in einem @autorelease Block einzuschließen zu die Speicherverwaltung für diese Objekte behandeln. Obwohl GCD Versand Warteschlangen haben ihre eigenen Autofreigabepools, sie keine Garantien treffen, wenn diese Pools abgelassen. Wenn Ihre Anwendung ist Speicher erzwungener, Ihren eigenen Autofreigabepool erstellen, können Sie bis befreien der Speicher für Autoreleased Objekte in wesentlich kürzeren Abständen.