2010-10-10 13 views
17

Me pregunto qué diferencias tales como desventajas y/o ventajas que hay para declarar una NSString esta manera:stringWithFormat vs initWithFormat en NSString

NSString *noInit = [NSString stringWithFormat:@"lolcatz %d", i]; 

en contraposición a:

NSString *withInit = [[NSString alloc] initWithFormat:@"Hai %d", i]; 

Lo que era la motivación de poner stringWithFormat en lugar de simplemente tener la forma initWithFormat de inicializar la cadena?

Respuesta

33

stringWithFormat: devuelve una cadena autorretratada; initWithFormat: devuelve una cadena que debe ser liberada por la persona que llama. El primero es un método llamado "de conveniencia" que es útil para cadenas de corta duración, por lo que la persona que llama no tiene que recordar llamar al release.

+0

Ok, gracias eso tiene sentido. –

+1

Golpeado al golpe por 32 segundos. :-) –

+2

En realidad; es el '+ alloc' que devuelve la instancia retenida ... el' init * 'no cambia el conteo retenido (pero puede, en este caso, devolverá una instancia diferente a la que se llamó). – bbum

3

En realidad encontré la entrada this blog en las optimizaciones de memoria ayer. En él, el autor proporciona razones específicas por las que elige usar [[NSString alloc] initWithFormat:@"..."] en lugar de [NSString stringWithFormat:@"..."]. Específicamente, los dispositivos iOS pueden no lanzar automáticamente el grupo de memoria tan pronto como prefiera si crea un objeto de liberación automática.

La versión anterior requiere que manualmente release que, en una construcción como esta:

NSString *remainingStr = nil; 
if (remaining > 1) 
    remainingStr = [[NSString alloc] initWithFormat:@"You have %d left to go!", remaining]; 
else if (remaining == 1) 
    remainingStr = [[NSString alloc] initWithString:@"You have 1 left to go!"]; 
else 
    remainingStr = [[NSString alloc] initWithString:@"You have them all!"]; 

NSString *msg = [NSString stringWithFormat:@"Level complete! %@", remainingStr]; 

[remainingStr release]; 

[self displayMessage:msg]; 

Aquí, remainingStr solamente se necesitaba temporal, y así a evitar el disparador automático (que puede ocurrir mucho más tarde en el programa), manejo explícitamente la memoria cuando la necesito.

+1

Es una elección entre la optimización prematura y el código claro y conciso. Las optimizaciones prematuras se pueden resolver más adelante mediante el análisis del rendimiento, el código poco claro es (por lo general) para siempre. – zaph

Cuestiones relacionadas