当你进行第二次分配,以你的string2
变量,你没有修改什么样的变量当前是指,在这种情况下,同样的NSString
可变string1
指的是内容,而是你正在修改到什么string2
指。
的图象(代码)是千言万语:
每个对象和可变具有内部名称,通常被称为它的地址。地址通常写成十六进制数字,例如0xdeadbeef
,值的数字对你来说并不重要 - 它只是一个标签。
当你写:
NSString *string1 = @"Hello!";
右手边问Objective-C的创造与价值@"Hello"
的NSString
,这样做的结果是一个地址,说0xfeeddeaf
。 lhs-side:请求一个变量,该变量能够容纳其中的NSString *
- 对NSString
的引用;称这个变量为string1
;并将rhs的结果,0xfeeddeaf
存储在其中。
当你写信:
NSString *string2 = string1;
这导致可变string2
还含有0xfeeddeaf
。 string1
和string2
的内容之间没有联系,赋值只是复制一个值(这是一个地址)。
最后,当你写:
string2 = @"changed";
这与@"changed"
一个地址,说的0xbeedcafe
并存储在string2
价值创造的NSString
。所以现在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"]
来源
2012-02-06 08:36:21
CRD
方法'-setString:'不会在[文档】(HTTPS存在://显影剂。 apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html)。这是一个私人API吗? – 2012-02-06 02:25:17
@ RichardJ.RossIII不,我只是一个白痴。它在'NSMutableString'中,你会看到我创建了一个'NSMutableString'实例。我只是继续使用'NSString *'存储类型,因为复制了原来的答案。所以从技术上讲,原文是完全有效和合法的,但会产生编译器警告;一个快速指针类型的变化(我现在就会生效),你甚至不会得到警告。 – Tommy 2012-02-06 12:35:17
好吧,我明白,一直发生在我身上。 – 2012-02-06 13:20:22