Подтвердить что ты не робот

StringWithFormat против initWithFormat на NSString

Мне интересно, какие различия, такие как недостатки и/или преимущества, связаны с объявлением NSString таким образом:

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

в отличие от:

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

Какова была мотивация размещения stringWithFormat вместо того, чтобы просто инициализировать строку initWithFormat?

4b9b3361

Ответ 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 требуется только временно, и поэтому, чтобы избежать авторекламы (которая может произойти МНОГО позже в программе), я явно обрабатываю память по мере необходимости.