Вопрос

Приведенный ниже код компилируется и запускается, НО в соответствии со всеми книгами по разработке для iPhone и документацией Apple не должно! Может кто-нибудь объяснить мне, почему неизменный NSString позволяет изменять свои значения после того, как он был установлен? Я думал, что я должен использовать NSMuttableString, чтобы изменить контекст той же строковой переменной? Я использую SDK 3.1.

NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
Это было полезно?

Решение

Возможно, следующий пример добавит ответы Марка и Нильса и поможет прояснить ситуацию.

Неизменяемые строки

// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;

// "Replace" the second string
str2 = @"Hello ikilimnik";

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

Изменяемые строки

// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;

// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

Обратите внимание, когда вы используете неизменный класс NSString, который является единственным способом "заменить" строка предназначена для создания новой строки и обновления вашей переменной " str2 " указать на это. Это, однако, не влияет на то, что "str1" указывает на, поэтому он по-прежнему будет ссылаться на исходную строку.

В примере NSMutableString мы не создаем вторую строку, а вместо этого изменяем (мутируем) содержимое существующего " Hello World " строка. Поскольку обе переменные продолжают указывать на один и тот же строковый объект, они обе сообщают о новом значении в вызове NSLog.

Важно различать переменную-указатель и реальный объект, на который она указывает. Объект NSString является неизменным, но это не мешает вам изменять значение переменной, указывающей на строку.

Тип данных " NSString * " является указателем на объект NSString, а не на сам объект. Если вы установите точку останова в любом из операторов NSLog в отладчике XCode, вы можете проверить необработанное значение каждой переменной, чтобы прояснить это.

Другие советы

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

TEST и TEST2 - это две разные строки, на которые указывает указатель * test.

Вы не изменяете содержимое явно выделенного объекта NSString из первой строки кода, а указываете * test на другой объект.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top