iPhone alloc или строковые литералы для NSString? - PullRequest
2 голосов
/ 25 января 2010

У меня есть быстрый вопрос о двух примерах ниже. В настоящее время я использую верхний пример при том понимании, что из-за ограниченных ресурсов iPhone лучше распределять и освобождать вручную, в отличие от использования буквального примера нижней строки. У кого-нибудь есть предпочтения, с кем идти?

if(activeSegment == 0) {
    NSString *newText = [[NSString alloc] initWithString:@"Hello World"];
    [helloLabel setText:newText];
    [newText release];
}

OR

if(activeSegment == 0) {
    NSString *newText = @"Hello World";
    [helloLabel setText:newText];
}

Лично я не думаю, что это имеет значение в этом случае, так как я устанавливаю текст на метке, которая не будет освобождена до тех пор, пока приложение не завершится.

1009 * Гэри *

Ответы [ 2 ]

7 голосов
/ 25 января 2010

Второй вариант определенно лучше. Строковые литералы - это просто указатели на ваш код, а не выделенная память. Вторая версия намного меньше веса. Вы также можете просто сделать:

[helloLabel setText: @"Hello World"];
5 голосов
/ 25 января 2010

Определенно второй, если речь идет только об оптимизации памяти. Первый выделяет строку в дополнение к статически выделенному, с которым вы ее инициируете (плюс накладные расходы на выделение объекта в куче).

NSString *newText = [[NSString alloc] initWithString:@"Hello World"];

Этот фрагмент динамически распределяет копию «Hello World», но «Hello World» должен существовать где-то, чтобы его сначала скопировали. ;)

Следует также отметить, что компилятор будет повторно использовать одни и те же ссылки на идентичные строки, когда это возможно, поэтому, если вы определите пять строк с «Hello World» в качестве их содержимого, на самом деле будет только одна.

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