【发布时间】:2012-07-18 20:28:38
【问题描述】:
我确实找到了一些关于这个话题的讨论,但这超出了我目前的理解水平。我正在阅读 Kochan 的“Objective-C 中的编程,4e”,并且正在阅读关于 NSString 对象的部分。首先,我正在玩的代码,所以我可以问我的问题:
NSString *strA = @"StringA";
NSString *strB = @"StringB";
NSLog(@"Value of strA: %@",strA);
NSLog(@"Value of strB: %@",strB);
strB = strA; // strB should point to strA's memory location
NSLog(@"New value of strB: %@",strB); //correctly logs as "StringA"
strA = @"StringA has been changed.";
NSLog(@"New value of strB: %@",strB); //logs as "StringA" still
NSLog(@"New value of strA: %@",strA); //correctly logs as "StringA has been changed"
我的理解是说 strB = strA 意味着 strB 指向 strA 的内存位置,因此对 strA 的任何更改也会转到 strB。然而,这不会发生。 Kochan 说它应该这样做,并且为了绕过它建议使用
strB = [NSString stringWithString: strA];
据我所知,这两种方法都有效。我可以说strB = strA,然后改变strA,但strB仍然保留它收到的值(strA在改变之前的值)。
我认为这可能是因为 NSString 是不可变的,但如果是这样,为什么我实际上可以在初始化后更改 str1 和 str2 的值?我在这里想念什么?谢谢。
【问题讨论】:
-
@andrewnc 欢迎来到 StackOverflow!请为正确的答案投票并接受最好的答案(或者,如果有相同的答案,第一个正确的答案)。
标签: objective-c memory reference