也许下面的示例将添加 Mark 和 Niels 的回复并帮助澄清事情。
不可变字符串
// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;
// "Replace" the second string
str2 = @"Hello ikilimnik";
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
可变字符串
// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;
// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
请注意,当您使用不可变的 NSString 类时,“替换”字符串的唯一方法是创建一个新字符串并更新变量“str2”以指向它。然而,这不会影响“str1”所指向的内容,因此它仍然会引用原始字符串。
在 NSMutableString 示例中,我们不创建第二个字符串,而是更改(改变)现有“Hello World”字符串的内容。由于两个变量继续指向同一个字符串对象,它们都会在调用 NSLog 时报告新值。
区分指针变量和它指向的实际对象很重要。 NSString 对象是不可变的,但这并不能阻止您更改指向字符串的变量的值。
数据类型“NSString *”是一个指向 NSString 对象的指针,而不是对象本身。如果您在 XCode 调试器中的任一 NSLog 语句处设置断点,您可能需要检查每个变量的原始值以澄清这一点。