2010-10-10 10 views
17

Zastanawiam się, jakie różnice, takie jak wady i/lub korzyści są do deklarowania NSString ten sposób:stringWithFormat vs. initWithFormat na NSString

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

w przeciwieństwie do:

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

Co było motywacja polegająca na wstawianiu stringWithFormat zamiast po prostu mieć sposób inicjowania ciągu znaków?

Odpowiedz

33

stringWithFormat: zwraca autoodczytany ciąg; initWithFormat: zwraca ciąg, który musi zostać zwolniony przez dzwoniącego. Pierwsza z nich jest tak zwaną metodą "wygody", która jest przydatna w przypadku krótkotrwałych łańcuchów, więc osoba dzwoniąca nie musi pamiętać, aby zadzwonić pod numer release.

+0

OK, dzięki, że ma to sens. –

+1

Pobity do uderzenia o 32 sekundy. :-) –

+2

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

3

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ę.

+1

To wybór pomiędzy przedwczesną optymalizacją a przejrzystym, zwięzłym kodem. Przedwczesne optymalizacje można później rozwiązać, analizując wydajność, a niejasny kod jest (zwykle) na zawsze. – zaph

Powiązane problemy