Mi sono imbattuto in this blog nell'ottimizzazione della memoria proprio ieri. In esso, l'autore fornisce ragioni specifiche per cui sceglie di utilizzare [[NSString alloc] initWithFormat:@"..."]
anziché [NSString stringWithFormat:@"..."]
. In particolare, i dispositivi iOS potrebbero non rilasciare automaticamente il pool di memoria non appena lo si preferisce se si crea un oggetto autorelease.
La versione precedente richiede che si manualmente release
esso, in un costrutto come questo:
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];
Qui, remainingStr
era necessario solo temporaneamente, e in modo da evitare l'autorelease (che può accadere molto più tardi nel programma), gestisco esplicitamente la memoria come ne ho bisogno.
Ok, grazie ha senso. –
Picchiato al pugno di 32 secondi. :-) –
In realtà; è il '+ alloc' che restituisce l'istanza mantenuta ... il' init * 'non cambia il conteggio dei ritiri (ma potrebbe - in questo caso - restituire un'istanza diversa da quella che era stata chiamata). – bbum