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.

War es hilfreich?

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.

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

  

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top