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.
Ok, gracias eso tiene sentido. –
Golpeado al golpe por 32 segundos. :-) –
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