Wczoraj natknąłem się na wpis dotyczący optymalizacji pamięci this blog. W nim autor podaje konkretne powody, dla których zdecydował się użyć [[NSString alloc] initWithFormat:@"..."]
zamiast [NSString stringWithFormat:@"..."]
. W szczególności urządzenia iOS mogą nie automatycznie zwolnić puli pamięci tak szybko, jak wolisz, jeśli utworzysz obiekt autorelease.
Dawna wersja wymaga ręcznego release
to, w konstrukcie, takie jak ten:
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];
Tutaj remainingStr
było potrzebne tylko tymczasowo, a więc aby uniknąć autorelease (co może się zdarzyć znacznie później w program), wyraźnie obsługuję pamięć, tak jak tego potrzebuję.
OK, dzięki, że ma to sens. –
Pobity do uderzenia o 32 sekundy. :-) –
Właściwie; jest to '+ alloc', który zwraca zatrzymaną instancję ...' init * 'nie zmienia wartości zatrzymania (ale może - w tym przypadku zwróci inną instancję, niż została wywołana). – bbum