2012-08-04 17 views
5

Nello sviluppo di app per iOS, stiamo utilizzando NSAutoreleasePool per abbandonare la proprietà di oggetti in un secondo momento.Perché è necessario utilizzare NSAutoreleasepool per ogni thread?

Ma perché può essere condiviso tra diversi thread?

Perché è necessario creare un nuovo autoreleasepool quando si desidera utilizzare un nuovo thread?

EDIT:

Come taskinoor menzionato la mia domanda era questo il motivo per cui è stato progettato in modo tale che ogni thread dovrebbe avere un autoreleasepool separata.

+1

[Questa domanda sembra molto correlata alla tua domanda] (http://stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) –

+1

Dovresti pensare a usare '@ autoreleasepool {...} 'invece di' NSAutoreleasePool'. Secondo la documentazione, è più efficiente. E se si esegue la migrazione su ARC, è obbligatorio. –

+0

Non so perché hai avuto bisogno di quella modifica, la mia risposta spiega il motivo :) –

risposta

5

La sfida di progettazione per i pool di autorelease multi-thread è quando scaricarli. Se si scarica la piscina mentre un oggetto è ancora in uso, si verificherà un arresto anomalo. Per thread, è facile capire quando ci si trova fuori dal ciclo di esecuzione e quindi in un punto in cui gli oggetti autorizzate possono essere svuotati. In una situazione multi-thread, i thread dovrebbero essere sincronizzati alla fine del loro runloop in modo da poter essere sicuri di essere in un punto sicuro per scaricarli. La pedalata sincronizzata in questo modo è una cattiva idea, crea molto tempo inattivo e rallenta il programma.

+1

Fai un ulteriore passo avanti; se qualche thread è bloccato in attesa di qualcosa - rete, stato thread, altro I/O - allora non è stato possibile svuotare il pool generale. – bbum

0

Non credo che le piscine autorelease sono condivisi tra i thread, secondo apples memory management guide a Cocoa ogni thread ha il proprio stack di piscine autorelease

Se non si crea una piscina autorelease per le discussioni che si creano o staccare, quindi la funzione di autorelease non funziona, quindi l'ingombro di memoria crescerà

2

Ogni thread è un contesto di esecuzione diverso - un thread potrebbe uscire prima o poi, potrebbero utilizzare risorse diverse con diverse durate e esigenze di gestione della memoria, quindi ciascuna thread dovrebbe essere gestito in modo indipendente.

1

Perché hanno progettato in questo modo. Immagino che la tua domanda sia la ragione per cui hanno progettato in questo modo. Non sono sicuro al 100%, ma un possibile motivo potrebbe essere il fatto che condividere una risorsa tra thread ha il suo costo. Durante ogni modifica al pool condiviso, ogni thread dovrà bloccare e sbloccare ciò che ridurrà le prestazioni. Una risorsa deve essere condivisa su più thread solo se tale condivisione è necessaria, il che non è il caso dei pool di autorelease. L'utilizzo del pool di autorelease dedicato funzionerà meglio. Questa potrebbe essere una delle possibili ragioni per questa decisione di progettazione.

+0

Grazie a Taskinoor – Krishnan

+1

Buona ipotesi, ma incompleta. I pool di autorelease devono essere per-thread perché non ci sarebbe modo di svuotare il pool senza che * tutti i thread * si trovino in uno stato in cui il loro pool potrebbe essere scaricato. Se * qualsiasi thread * è bloccato in attesa di input, il drenaggio non può avvenire. La risposta di Jeffeery è corretta. – bbum

+1

@bbum, grazie. Non ho pensato di prosciugare la piscina e sono d'accordo sul fatto che la risposta di Jeffery sia migliore della mia. – taskinoor

Problemi correlati