StringWithFormat против initWithFormat на NSString
Мне интересно, какие различия, такие как недостатки и/или преимущества, связаны с объявлением NSString таким образом:
NSString *noInit = [NSString stringWithFormat:@"lolcatz %d", i];
в отличие от:
NSString *withInit = [[NSString alloc] initWithFormat:@"Hai %d", i];
Какова была мотивация размещения stringWithFormat
вместо того, чтобы просто инициализировать строку initWithFormat
?
Ответы
Ответ 1
stringWithFormat:
возвращает строку с автореализацией; initWithFormat:
возвращает строку, которую должен выпустить вызывающий. Первый - это так называемый "удобный" метод, который полезен для короткоживущих строк, поэтому вызывающему абоненту не нужно запоминать вызов release
.
Ответ 2
Я на самом деле натолкнулся на этот блог в блоге по оптимизации памяти только вчера. В нем автор дает конкретные причины, по которым он предпочитает использовать [[NSString alloc] initWithFormat:@"..."]
вместо [NSString stringWithFormat:@"..."]
. В частности, устройства iOS не могут автоматически освобождать пул памяти, как только вы захотите, если вы создадите объект автоопределения.
Первая версия требует, чтобы вы вручную release
это, в такой конструкции, как:
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];
Здесь remainingStr
требуется только временно, и поэтому, чтобы избежать авторекламы (которая может произойти МНОГО позже в программе), я явно обрабатываю память по мере необходимости.