有很多关于同一主题的帖子,这可能是一个愚蠢的问题,但我一直无法理解这个概念。
我知道将可变字符串分配给不可变字符串时会出现的问题,以及为什么我应该使用复制来避免这些问题。
我不太明白的是: NSString 不能被修改到底是什么意思?
如果我这样做:
NSString *foo = @"Hello World!";
foo = @"Hello everybody!";
我知道我不是在修改 foo 的值,而是用新实例替换旧实例。但是,如何定义我不能重写可变对象?
更新 我尝试运行以下代码:
-(void)immutable
{
NSString *myString1 = @"Hello!";
NSString *myString2 = myString1;
NSLog(@"myString1 address: %p", &myString1); //Prints 0xbfffdb30
NSLog(@"myString2 address: %p", &myString2); //Prints 0xbfffdb2c
myString2 = @"Good bye!";
NSLog(@"myString2 address: %p", &myString2); //Prints 0xbfffdb2c
NSMutableString *myMutableString = [NSMutableString stringWithString:@"Hello"];
NSString *myString3 = myMutableString;
NSLog(@"myMutableString address: %p", &myMutableString); //Prints 0xbfffdb28
NSLog(@"myString3 address: %p", &myString3); //Prints 0xbfffdb24
[myMutableString setString:@"Hello World"];
NSLog(@"myString3: %@", myString3); //Prints Hello World
myString3 = myString1;
NSLog(@"myString3 address: %p", &myString3); //Prints 0xbfffdb24
[myMutableString setString:@"Nothing to do"];
NSLog(@"myString3: %@", myString3); //Prints Hello!
}
我对 myString1 和 myString2 的地址不同并不感到惊讶,因为它们都是不可变对象。但即使在为 myString2 分配了不同的字符串之后,它仍然指向与以前相同的地址。不应该改变吗?
但在 myMutableString 和 myString3 的情况下,即使 myMutableString 中的任何更改都会反映在 myString3 中,它们仍然有不同的地址。在我将 myString1 分配给 myString3 之后,myString3 指向的地址没有改变,但是它不再与 myMutableString 相关,因为我对其所做的每一个更改都将不再反映在 myString3 中。首先是什么导致 myString3 和 myMutableString 被链接?