我确实找到了一些关于这个话题的讨论,但这超出了我目前的理解水平。我正在阅读 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 的值?我在这里想念什么?谢谢。