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?
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?
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).
Trovo che il rilascio di foo causi il blocco del programma con "il puntatore liberato non è stato allocato" – bobobobo
@bobobobo Sono completamente d'accordo con te. –
Come accennato nella documentazione
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.
Questa è la risposta completa .... grazie a lotttt –
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? –
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 alloc
retain
, 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"
NSString *str = [NSString string];
è equivalente a:
NSString *str = [[[NSString alloc] init] autorelease];
così release
o autorelease
non devono essere passati anche qui.
Mi dispiace aggiungere la risposta troppo tardi, ma penso che dovresti controllare la completezza in quanto la risposta di Ben ha qualche errore. –