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?
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?
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).
Me parece que la liberación de Foo hace que mi programa se bloquee con "el puntero que se liberó no se asignó" – bobobobo
@bobobobo Estoy completamente de acuerdo con usted. –
Como se menciona en la documentación
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.
Esta es la respuesta completa .... muchas gracias –
¿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? –
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 "
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.
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. –