2008-12-01 13 views
19

Al crear una cadena usando la siguiente notación:¿Se ha lanzado un NSString literal o se debe lanzar?

NSString *foo = @"Bar"; 

¿Es necesario para liberar foo? ¿O se libera foo en este caso?

+0

Lamento agregar la respuesta demasiado tarde, pero creo que debería verificar si está completa ya que la respuesta de Ben tiene algún error. –

Respuesta

17

Las cadenas asignadas del compilador (del formato @ "STRING") son constantes, por lo que se ignoran los mensajes de "retener", "liberar" y "liberar". No es necesario liberar o liberar automáticamente a foo en este caso (pero no va a doler).

+0

Me parece que la liberación de Foo hace que mi programa se bloquee con "el puntero que se liberó no se asignó" – bobobobo

+0

@bobobobo Estoy completamente de acuerdo con usted. –

15

Como se menciona en la documentación

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

tomar posesión de un objeto si crea empleando un método cuyo nombre comienza con “alloc” o “nuevo” o contiene “ copy "(por ejemplo, alloc, newObject o mutableCopy), o si usted le envía un mensaje de retención. Usted es responsable de renunciar propiedad de los objetos que posee utilizando versión o liberación automática. En cualquier otro momento usted recibe un objeto, no debe liberarlo .

Como no está utilizando alloc, copy, etc., no tiene que preocuparse por soltar el objeto.

+0

Esta es la respuesta completa .... muchas gracias –

+0

¿Hay algún cambio después de ARC? Leí los literales de cadena que quedan en la memoria y se destruyen cuando el programa deja de ejecutarse. ¿Uno debería preferir crear cadenas usando alloc sobre literales? –

6

Estoy de acuerdo con @Ben \ Gottlieb en "compilador asigna cadenas (del formato @" STRING ") son constantes", pero como no los ha inicializado por medio de pasar un mensaje de alloc o retain, no hay que pasar release o autorelease mensaje para ellos de lo contrario su aplicación va a chocar con el siguiente registro

"puntero está liberando no se asignaron "

NOTE

NSString *str = [NSString string]; 

es equivalente a:

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

por lo release o autorelease no se deben pasar aquí también.

Cuestiones relacionadas