2010-06-18 24 views
5

Estaba mirando el código de otra persona y noté que llamaban 'liberar' en un NSString que no tenían (nunca se llamaba alloc/retain/copy anywhere y no era una propiedad).¿Llamar 'liberación' muchas veces?

Esto me pareció un poco extraño y me hizo preguntarme si podría ocurrir algún comportamiento extraño si llamas 'liberación' en un objeto que no es 'propio' o cuyo recuento de ref ya es 0? El siguiente código compila/funciona bien sin advertencias, así que supongo que no hay problema, pero tenía curiosidad.

// Releasing an object I don't own 
NSString *notMyString = [NSString stringWithString:@"Not mine."]; 
[notMyString release]; // Ignored? 

// Releasing an object I own, twice 
NSString *myString = [[NSString alloc] initWithString:@"Mine."]; 
[myString release]; // Ref count = 0 
[myString release]; // Ref count = ? 
+2

La razón por la que el código "funciona" es porque NS-String -initWithString: reconoce que la cadena que se pasa es una cadena constante y, por lo tanto, no hay necesidad de una nueva asignación. Como las cadenas constantes ignoran de forma efectiva retención/liberación, el código funciona de manera coincidente. – bbum

Respuesta

15

Sí, no hagas eso. Su evaluación es correcta, al igual que su comprensión de las reglas de propiedad. Enviar un mensaje a un objeto ya lanzado tiene un comportamiento indefinido: a veces tendrás suerte porque otras cosas suceden y no pasará nada. Algunas veces se bloqueará de inmediato, a veces más tarde porque corrompió algo más.

+2

Sí, es el comportamiento a largo plazo del que estaba preocupado. Supongo que no siempre puedes confiar en el código 'tutorial' del blog al azar como-es =). Gracias por la rápida respuesta. – nebs

Cuestiones relacionadas