Изменить указатель на NSString в Objective-C - PullRequest
0 голосов
/ 04 марта 2012

Я немного экспериментировал с Objective-C и заметил, по крайней мере для меня, довольно странное поведение. Сначала я определяю указатель на NSString и добавляю его в NSArray:

NSString *s = @"A";
NSArray *a = [NSArray arrayWithOject: s];

Затем я распечатываю значение s, а также содержимое a:

NSLog(@"%@", s);
NSLog(@"%@", myArray);

и в обоих случаях выводом является A. Теперь, если я изменю указатель s, скажем

s = @"B";

затем два оператора NSLog выводят B и A. соответственно.

То есть указатель в моем массиве все еще указывает на @"A". После многих лет написания кода на Java это очень удивляет меня. Я что-то упускаю здесь что-то действительно фундаментальное?

Спасибо, Майкл Кнудсен

Ответы [ 4 ]

1 голос
/ 04 марта 2012

Поведение Java и Objective-C одинаковы.Со следующим кодом Java:

String foo = "foo";

Vector myVector = new Vector();
myVector.add(foo);

System.out.println(foo);
System.out.println(myVector);

foo = "bar";

System.out.println(foo);
System.out.println(myVector);

Выводятся следующие значения:

foo
[foo]
bar
[foo]

Примечание. То же самое верно, если я использую String [] вместо Vector, но NSArrayбольше похоже на вектор, чем на строку [].

1 голос
/ 04 марта 2012

Самый простой способ понять это - @"A" создает новый объект NSString.

В вашем коде вы устанавливаете указатель s, чтобы он указывал на этот объект, а затем добавляете исходный объект (не указатель) в массив. Затем вы меняете адрес, на который указывает указатель, на новый адрес.

Если вы хотите изменить исходный объект, тогда используйте NSMutableString и измените фактический объект (вместо изменения указателя на новый объект), и они оба обновятся, как вы ожидаете.

Попробуйте:

 NSMutableString *s = @"A";
 // Add to array
 [s setString:@"B"]
1 голос
/ 04 марта 2012

Это потому, что строки NSSt неизменны, как в Java, поэтому вы не изменяете содержимое объекта, хранящегося по адресу x (тот, который есть у nsarrsy), вы указываете s на адрес y.

0 голосов
/ 06 ноября 2012

Самый простой способ увидеть это - увидеть, что ваши s = @"B"; просто указывают s на другой строковый объект, а не модифицируют исходный объект.

Таким образом, массив все еще содержит @ "A". Когда вы добавляете объекты в NSArray, вы просто делаете указатель в NSArray, чтобы он указывал на @ "A". Это никогда не изменится.

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