2008-12-01 13 views
19

Quando si crea una stringa utilizzando la seguente notazione:Un NSString letterale è autoreleased o deve essere rilasciato?

NSString *foo = @"Bar"; 

C'è bisogno di rilasciare foo? Oppure è foo autoreleased in questo caso?

+0

Mi dispiace aggiungere la risposta troppo tardi, ma penso che dovresti controllare la completezza in quanto la risposta di Ben ha qualche errore. –

risposta

17

Le stringhe allocate del compilatore (del formato @ "STRING") sono costanti e quindi i messaggi di tipo -retain, -release e -autorelease vengono ignorati. In questo caso non devi rilasciare o autorelease foo (ma non farà male).

+0

Trovo che il rilascio di foo causi il blocco del programma con "il puntatore liberato non è stato allocato" – bobobobo

+0

@bobobobo Sono completamente d'accordo con te. –

15

Come accennato nella documentazione

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Tasks/MemoryManagementRules.html

si prende la proprietà di un oggetto se si create impiegando un metodo il cui nome inizia con “alloc” o “nuovi” o contiene “ copia "(ad esempio, alloc, newObject o mutableCopy) oppure se si invia un messaggio di conservazione a . Sei il responsabile della cessione della proprietà di oggetti che possiedi utilizzando la release o di autorelease. In qualsiasi altro momento si riceve un oggetto, non è necessario rilasciarlo .

Poiché non si utilizza alloc, copia, ecc. Non è necessario preoccuparsi di rilasciare l'oggetto.

+0

Questa è la risposta completa .... grazie a lotttt –

+0

Qualcosa cambia dopo ARC? Ho letto i letterali delle stringhe che rimangono in memoria e vengono distrutti quando il programma smette di funzionare. Si dovrebbe preferire la creazione di stringhe usando l'allocazione su letterali? –

6

Sono d'accordo con @ Ben \ Gottlieb a "Compiler assegnato archi (del formato @" STRING ") sono costanti", ma come non li avete inizializzato tramite il superamento di un messaggio o di allocretain, non deve passare release o autorelease messaggio a loro altrimenti la vostra applicazione andrà in crash con il seguente registro

"puntatore viene liberata non era assegnati"

NOTE

NSString *str = [NSString string]; 

è equivalente a:

NSString *str = [[[NSString alloc] init] autorelease]; 

così release o autorelease non devono essere passati anche qui.