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 = ?
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