Как лучше обрабатывать временные строки? - PullRequest
0 голосов
/ 05 июля 2010

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

Мне нужноназначить некоторые строки внутри структуры if, но использовать их вне структуры if, чтобы их нужно было создавать вне if, я думал что-то вроде:

NSString *arbString = [[NSString alloc] init];

if(whatever)
{
    arbString = @"Whatever"
}
else
{
    arbString = @"SomethingElse"
}

myLabel.text = arbString;
[arbString release];

Я видел примеры, когда люди просто использовали:

NSString *arbString;

для создания строковой переменной

Руководство Google Objective C гласит, что во время создания предпочтительнее автоматическое высвобождение:

"При создании новых временных объектов автоматически высвобождайте их в одной строкекак вы создаете их, а не как отдельный выпуск позже в том же методе ":

// AVOID (unless you have a compelling performance reason)
MyController* controller = [[MyController alloc] init];
// ... code here that might return ...
[controller release];

// BETTER
MyController* controller = [[[MyController alloc] init] autorelease];

Так что я понятия не имею, что является лучшей практикой?

1 Ответ

1 голос
/ 05 июля 2010

В приведенном вами примере вы фактически потеряете ссылку на строку NSSt, созданную вами при назначении ее в arbString = @"Whatever". Затем вы освобождаете строковую константу (что, кстати, недопустимо).

Итак, есть утечка памяти, поскольку вы никогда не освобождаете созданную вами строку NSString.

Помните, что все эти типы являются указателями, поэтому = только переназначает их.

Что касается вопроса, в этом примере вам не нужен [[NSString alloc] init]. В любом случае вам не нужно копировать строку в локальную переменную, вы можете просто установить myLabel.text в строковую константу @"Whatever".

(редактировать: это не значит, что вы не можете использовать указатель arbString, arbString = @"Whatever"; myLabel.text = arbString нормально. Но это просто назначение указателя, а не копирование)

Если вам нужно было манипулировать строкой до ее возвращения, вы должны создать NSMutableString и либо освободить, либо автоматически разблокировать ее. Лично создайте автоматически выпущенные объекты с помощью методов класса, поэтому в этом примере я бы использовал [NSString string] или [NSString stringWithString:], которые возвращают автоматически выпущенные объекты.

...