stringWithFormat против initWithFormat на NSString - PullRequest
17 голосов
/ 10 октября 2010

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

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

вместо:

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

Что побудило поставить stringWithFormat вместо простого initWithFormat способа инициализации строки?

Ответы [ 2 ]

33 голосов
/ 10 октября 2010

stringWithFormat: возвращает автоматически освобожденную строку; initWithFormat: возвращает строку, которая должна быть освобождена вызывающей стороной. Первый - это так называемый «удобный» метод, который полезен для коротких строк, поэтому вызывающий не должен забывать вызывать release.

3 голосов
/ 30 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...