2012-02-06 94 views
0

我想修改一个指针的内容使用另一个。我希望string2指向string1指向的内容,以便在修改string2时修改string1。我怎样才能做到这一点?简单复制指针与目标C

NSString *[email protected]"hello"; 
NSString *string2=string1; 
[email protected]"changed"; 
NSLog(@"string1:%@, string2:%@", string1, string2); //"string1:hello, string2:changed" 

回答

2

当你进行第二次分配,以你的string2变量,你没有修改什么样的变量当前是指,在这种情况下,同样的NSString可变string1指的是内容,而是你正在修改到什么string2指。

的图象(代码)是千言万语:

每个对象和可变具有内部名称,通常被称为它的地址。地址通常写成十六进制数字,例如0xdeadbeef,的数字对你来说并不重要 - 它只是一个标签。

当你写:

NSString *string1 = @"Hello!"; 

右手边问Objective-C的创造与价值@"Hello"NSString,这样做的结果是一个地址,说0xfeeddeaf。 lhs-side:请求一个变量,该变量能够容纳其中的NSString * - 对NSString的引用;称这个变量为string1;并将rhs的结果,0xfeeddeaf存储在其中。

当你写信:

NSString *string2 = string1; 

这导致可变string2还含有0xfeeddeafstring1string2的内容之间没有联系,赋值只是复制一个值(这是一个地址)。

最后,当你写:

string2 = @"changed"; 

这与@"changed"一个地址,说的0xbeedcafe并存储在string2价值创造的NSString。所以现在string1包含0xfeeddeaf这是@Hello的地址,而string2包含0xbeedcafe这是@"changed的地址。

当你写,你我猜“尝试使用修改一个指针的内容,另一个”你想要什么是string1string2来指代相同对象,其值可以修改。您无法修改NSString的值,创建后它们是不可修改的(不可变的)。相反,您必须使用NSMutableString您需要使用方法来更改NSMutableString对象的值 - 如上所述,如果使用分配,您更改引用哪个对象,而不是对象的内容。

假设你正在使用ARC [*]然后改变你的代码:

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

将完成什么,我认为你打算。前两行执行与上面类似的操作,最后会显示包含相同地址的string1string2。第三行改变了他们都提到的地址 - 你有你想要的联系。

[*]如果要使用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" 
0

作为替代理查德·罗斯三世的答案,因为他们已经指针 - 你买了一个间接层 - 只要确保你改变在他们指向的地址是什么同时把它留在那个地址。所以,例如

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

[string2 setString:@"changed"]; 

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

,因为它去太多反对的正常可可实践的流动,但了解这是怎么回事指针和如何通信的对象是值得它不是一个真正的可行的通用解决方案。

+0

方法'-setString:'不会在[文档】(HTTPS存在://显影剂。 apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html)。这是一个私人API吗? – 2012-02-06 02:25:17

+0

@ RichardJ.RossIII不,我只是一个白痴。它在'NSMutableString'中,你会看到我创建了一个'NSMutableString'实例。我只是继续使用'NSString *'存储类型,因为复制了原来的答案。所以从技术上讲,原文是完全有效和合法的,但会产生编译器警告;一个快速指针类型的变化(我现在就会生效),你甚至不会得到警告。 – Tommy 2012-02-06 12:35:17

+0

好吧,我明白,一直发生在我身上。 – 2012-02-06 13:20:22