2011-01-22 6 views
8

La mia struttura dell'applicazione è la seguente, la parte principale è scritta in C++ e utilizza il thread pesantemente, e sto sviluppando l'interfaccia utente in Objective C su di esso, se non eseguo il thread funziona correttamente, ma io non si può disabilitare, smettere di filo, interfaccia utente si blocca in modo casuale nel registro ho potuto vedere, seguente messaggioChe cosa significa "Autoreleased senza pool in place"?

__NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking 

messaggi simili provenienti più di una volta, googling venuto a sapere, ho bisogno di impostare NSAutoreleasePool di sbarazzarsi di esso, ma come è possibile integrare lo stesso con il codice C++.

Edit: core lib sarà attivato dall'interfaccia utente, quindi suppongo, il suo sicuro dire UI si esegue nel thread principale, Lib sta creando/chiude filo senza informare UI, in questo caso, posso chiamare AutoReleasePool nell'interfaccia utente

Qualcuno può guidarmi?

risposta

7

vedere questi documenti per quello che dovete sapere su multithreading con cacao: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

E 'OK per progettare la vostra applicazione, come avete, ma due cose dovrebbero essere tenuti a mente:

  1. La vita è più semplice (e talvolta necessario) quando l'interfaccia utente controlla come visualizzazioni (AppKit o UIKit) vengono manipolate sul thread principale. È possibile utilizzare oggetti Foundation e alcuni oggetti AppKit/UIKit su thread in background e alcuni oggetti Foundation possono essere utilizzati da più thread.
  2. Se si utilizzano oggetti Cocoa in tutti i thread in background, è necessario impostare i pool di autorelease su tali thread.

Come così:

- (void)backgroundThreadStart 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // do stuff 

    [pool release]; 
} 

che risolverà i vostri errori di console, ma si potrebbe avere altri problemi che hanno portato alla attuale crash si stava vedendo.

+0

Ciao, fammi provare ad aggiungere qualcosa di più nella mia domanda – Amitg2k12

1

Significa che si autorelease qualcosa senza un pool di autorelease in atto.

Ogni thread ha una serie di pool di autorelease. Sul thread principale, viene creato un pool di autorelease prima che Cocoa invii il tuo codice e si svuoti dopo il ritorno del codice. Ogni oggetto che si autorelease (esplicitamente o implicitamente) entra nel pool, in modo che il pool lo rilascerà quando la piscina si scarica. Quando si crea un thread, è necessario creare e drenare un pool di autorelease su quel thread. (O semplicemente non autorizza qualsiasi cosa, ma è praticamente impossibile per qualsiasi quantità significativa di codice.)

Se si decide di eseguire il codice sotto garbage-collection, è necessario inviare il pool drain, non release, quando hai finito con questo, perché la piscina sia utile. Quando GC è abilitato, i messaggi release e autorelease non fanno nulla, non vengono nemmeno visualizzati. Il pool di autorelease risponderà a drain effettuando il garbage collector, che è l'equivalente più vicino a rilasciare gli oggetti che sarebbero stati nel pool.

The Memory Management Programming Guide for Cocoa ha più informazioni sui pool di autorelease, tra le altre cose.