2011-03-06 5 views
5

Su iOS/CocoaTouch vedo spesso il codice che crea una nuova istanza di NSAutoreleasePool all'interno di un metodo. Di recente ne ho visto uno in una NSOperation.NSAutoreleasePool. Quando è opportuno creare un nuovo pool di autorelease?

Quali sono le regole di base per l'impostazione di una nuova istanza di NSAutoreleasePool? Perché è preferibile affidarsi semplicemente al pool di release preesistente creato in main.m?

Grazie,
Doug

risposta

6

è possibile utilizzare un nuovo pool autorelease ogni volta che vuoi, ma non è sempre utile. È richiesto ogni volta che si avvia una nuova discussione o gli oggetti rilasciati automaticamente in quel thread saranno trapelati. È anche comune creare nuovi pool di autorelease in un metodo in cui si crea e si autorizza un numero elevato di oggetti. Ad esempio, se si avesse un ciclo che creava 10 oggetti in ognuna delle 50 iterazioni, dovresti prendere in considerazione la creazione di un pool di autorelease per quel metodo, se non come parte del ciclo, in modo che ne venga creato uno nuovo per ogni iterazione.

+0

Quando è un pool autorelease locale non utile. Raccolgo la motivazione per la creazione di uno è per la gestione dei mem grani fini. Inoltre, dichiari che un nuovo pool di autorelease deve essere creato per i nuovi thread. È vero per NSOperations? Sono un tester fanatico e non vedo perdite di mems con le mie attuali NSOperations che mancano di un pool di autorelease locale. – dugla

+0

@dugla Non sono sicuro se è necessario crearne uno per NSOperations. Quando un oggetto viene rilasciato automaticamente senza pool, stampa un messaggio sulla console, quindi dovresti sapere se ne hai bisogno. La creazione di un pool non è vantaggiosa se non si creano molti oggetti durante la sua durata perché si aggiunge un'allocazione aggiuntiva e si riprendono i cicli del processore. Non può avere alcun beneficio a meno che non si utilizzino oggetti ogg-c durante la sua vita, dal momento che altri oggetti non la usano. – ughoavgfhw

3

Crea il tuo pool quando non ce n'è già uno (come in un nuovo thread) o quando quello nel ciclo di esecuzione non è sufficiente (creando oggetti autoreleased in un ciclo che verrà eseguito per molti iterazioni), o quando si desidera un maggiore controllo su quando gli oggetti autoreleased creati vengono infine rilasciati.

1

Ho eseguito il test in iOS 4.3 ed è necessario creare un pool di autorelease quando si esegue performSelectorInBackground. Non è necessario creare quando si utilizza NSOperation o dispatch_async.

Sembra in iOS> = 5.0 il sistema crea automaticamente il pool di autorelease anche se si utilizza performSelectorInBackground, quindi non è stato possibile trovare un caso quando è necessario creare un pool di autorelease.

Impossibile trovare quella modifica documentata, però.