Простое копирование указателей с Objective C

objective-c

806 просмотра

3 ответа

Я пытаюсь изменить содержимое одного указателя с помощью другого. Я хочу, чтобы строка2 указывала на то, на что указывает строка1, поэтому при изменении строки2 она изменяет строку1. Как я могу это сделать?

 NSString *string1=@"hello";
 NSString *string2=string1;
 string2=@"changed";
 NSLog(@"string1:%@, string2:%@", string1, string2); //"string1:hello, string2:changed"
Автор: Snowman Источник Размещён: 12.11.2019 09:09

Ответы (3)


3 плюса

Решение

Когда вы делаете второе присваивание вашей string2переменной, вы не изменяете содержимое того, на что переменная ссылается в данный момент, в этом случае то же самое, NSStringчто и переменная string1, а скорее вы изменяете то, на что string2ссылаетесь.

Картинка (код) стоит тысячи слов:

Каждый объект и переменная имеют внутреннее имя, обычно называемое его адресом . Адреса обычно пишутся в виде шестнадцатеричных чисел, например 0xdeadbeef, значение числа для вас не важно - это просто метка.

Когда вы пишете:

NSString *string1 = @"Hello!";

правая часть просит Objective-C создать значение NSStringсо значением @"Hello", скажем, результатом является адрес 0xfeeddeaf. Сторона lhs запрашивает переменную, способную содержать NSString *в ней - ссылку на NSString; вызвать эту переменную string1; и сохранить результат rhs 0xfeeddeaf, в него.

Когда ты сейчас пишешь:

NSString *string2 = string1;

это приводит к переменной, string2также содержащей 0xfeeddeaf. Нет никакой связи между содержимым string1и string2, присваивание просто копирует значение (которое в данном случае является адресом).

Наконец, когда вы пишете:

string2 = @"changed";

это создает NSStringсо значением @"changed", скажем, с адресом 0xbeedcafeи сохраняет его в string2. Итак, теперь string1содержит, 0xfeeddeafкоторый является адресом @Hello, и string2содержит, 0xbeedcafeкоторый является адресом @"changed".

Я предполагаю , что когда вы пишете , что вы «пытаетесь изменить содержимое одного указателя с помощью другого» , что вы хотите, чтобы string1и string2ссылаться на тот же объект, значение которого можно изменить. Вы не можете изменить значение NSString, они не изменяются (неизменяемые) после создания. Вместо этого вы должны использовать NSMutableString и вам нужно использовать метод для изменения значения NSMutableStringобъекта - как показано выше, если вы используете присваивание, вы изменяете, к какому объекту относится, а не к содержимому объекта.

Предполагая, что вы используете ARC [*], затем измените код на:

NSMutableString *string1 = [NSMutableString stringWithString:@"Hello"];
NSMutableString *string2 = string1;
[string2 setString:@"changed"];

выполнит то, что я думаю, вы намерены. Первые две строки выполняются так же, как и выше, и вы в конечном итоге string1и string2с тем же адресом. Третья строка меняет то, что находится по адресу, на который они оба ссылаются - у вас есть связь, которую вы намеревались.

[*] если вы используете GC или retain/ releaseизмените rhs первой строки на[[NSMutableString alloc] initWithString:"@Hello"]

Автор: CRD Размещён: 06.02.2012 08:36

4 плюса

Вам нужен указатель на экземпляр NSString. Пример:

NSString *string1 = @"Hello!";
NSString **string2 = &string1; // get the address of string1
*string2 = @"changed"; // set what string2 points to be 'changed'

NSLog(@"string1:%@, string2:%@", string1, *string2); // should print "string1: changed, string2: changed" 
Автор: Richard J. Ross III Размещён: 06.02.2012 01:57

0 плюса

В качестве альтернативы ответу Ричарда Дж. Росса III, поскольку они уже являются указателями - покупая вам уровень косвенности - просто убедитесь, что вы меняете то, на что они указывают по адресу, оставляя его по этому адресу. Так, например,

NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"];
NSMutableString *string2 = string1;

[string2 setString:@"changed"];

NSLog(@"string1: %@, string2: %@"); // "string1: changed, string2: changed"

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

Автор: Tommy Размещён: 06.02.2012 02:14
Вопросы из категории :
32x32