При объявлении нового объекта String необходимо ли сначала создавать его экземпляр? - PullRequest
0 голосов
/ 04 апреля 2011

Необходимо ли создавать экземпляр для нового строкового объекта, как показано в следующем коде:

NSString *newText = [[NSString alloc] initWithFormat:@"%@",sender.titleLabel.text];

Или мы можем просто запустить следующий код:

NSString *newText = sender.titleLabel.text;

который, я верю, даст тот же результат. Так, когда мы знаем, требуются ли "alloc" и "init", а когда нет?

Спасибо

Zhen

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

Вы можете просто использовать присвоение (newText = sender.titleLabel.text;).

Результаты ваших двух примеров не совпадают, кстати: в вашем первом примере вы создаете новый объект, во втором вы повторно используетесуществующий.В первом примере вам потребуется позже вызвать [newText release]; (или autorelease), а во втором - нет.

Если вы намереваетесь сохранить строку в переменной экземпляра, вам следует скопировать ее (myInstanceVariable = [sender.titleLabel.text copy];).Причина в том, что может быть экземпляром NSMutableString, который может измениться и, следовательно, привести к неожиданному поведению.

2 голосов
/ 04 апреля 2011

При использовании:

NSString *newText = sender.titleLabel.text;

вы просто устанавливаете указатель на существующий объект в sender.titleLabel.text. Вы говорите компилятору, что этот новый указатель указывает на объект типа NSString.

Примечание: указатели newText и sender.titleLabel.txt теперь оба указывают на один и тот же объект, поэтому изменения, внесенные в базовый объект (например, изменение текста), будут отражены при доступе к объекту с помощью либо указатели.

Примечание 2: при использовании:

NSString *newText = [[NSString alloc] initWithFormat:@"%@",sender.titleLabel.text];

Вы создали совершенно новый объект (с помощью alloc), а затем инициализировали этот новый объект со строковым значением sender.titleLabel.text во время выполнения операции alloc. Теперь newText и sender.titleLabel.text - это два совершенно разных объекта NSString, которые в любом случае не связаны друг с другом и могут быть изменены / управляемы / использованы / dealloc'd полностью независимо от друг друга.

...