关于同一主题有很多帖子,这可能是一个愚蠢的问题,但我一直无法理解这个概念。为什么像NSString和NSNumber这样的对象不能被覆盖?
我知道当您将可变字符串分配给不可变字符串时出现的问题,以及为什么我应该使用副本来避免这些问题。
我不明白的是:究竟是什么意思,一个NSString不能被修改?
如果我这样做:
NSString *foo = @"Hello World!";
foo = @"Hello everybody!";
我明白我没有修改Foo的值,而是用一个新的,而替换旧的实例。但是,那么如何定义我不能重写一个可变对象呢?
UPDATE 我试图运行下面的代码:
-(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首先被链接?
'&myString'获取本地指针的地址,而不是对象的地址。在方法的开始处设置断点,并在调试窗格中观察对象的地址。 –
谢谢!我对测试结果感到困惑,但现在一切都很清楚。 –