Простое копирование указателей с 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"]
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Вопросы из категории :
- objective-c Приложение для iPhone в ландшафтном режиме, системы 2008
- objective-c Как программно отправить смс на айфон?
- objective-c Открытие нестандартного URL в приложении Какао
- objective-c Каков наилучший способ перетащить NSMutableArray?
- objective-c Как работает пул автозапуска NSAutoreleasePool?
- objective-c Как вы можете создать Makefile из проекта Xcode?
- objective-c Скругленные углы на UIImage
- objective-c Как мне создать временный файл с Какао?
- objective-c Как распечатать трассировку стека на консоль / журнал в Cocoa?
- objective-c @class vs. #import
- objective-c COMET (серверный клик для клиента) на iPhone
- objective-c Правильный способ выхода из приложения iPhone?
- objective-c NSDictionary с упорядоченными ключами
- objective-c Как получить размер масштабируемого UIImage в UIImageView?
- objective-c Установите максимальную длину символа UITextField
- objective-c Как сделать ссылку на приложение в магазине приложений
- objective-c What is the difference between #import and #include in Objective-C?
- objective-c Методы для реализации -hash на изменяемых объектах какао
- objective-c Определить устройство (iPhone, iPod Touch) с помощью iOS
- objective-c Как я могу программным образом определить, работает ли мое приложение в симуляторе iphone?