NSString immutable允许更改其值?

Igo*_*nik 5 objective-c immutability nsstring

下面的代码编译并运行,但根据所有iPhone开发书籍和Apple文档它不应该!有人可以向我解释一下,不可变的NSString如何在设置后更改其值?我以为我必须使用NSMuttableString来更改相同字符串变量的上下文?我正在使用SDK 3.1.

NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
Run Code Online (Sandbox Code Playgroud)

小智 21

也许下面的例子将添加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);
Run Code Online (Sandbox Code Playgroud)

可变字符串

// 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);
Run Code Online (Sandbox Code Playgroud)

请注意,当您使用不可变NSString类时,"替换"字符串的唯一方法是创建新字符串并更新变量"str2"以指向它.然而,这不会影响"str1"指向的内容,因此它仍将引用原始字符串.

在NSMutableString示例中,我们不创建第二个字符串,而是改变(mutate)现有"Hello World"字符串的内容.由于两个变量都继续指向相同的字符串对象,因此它们都会在对NSLog的调用中报告新值.

区分指针变量和它指向的实际对象很重要.NSString对象是不可变的,但这并不能阻止您更改指向字符串的变量的值.

数据类型"NSString*"是指向NSString对象的指针,而不是对象本身.如果在XCode调试器中的任一NSLog语句中设置断点,您可能希望检查每个变量的原始值以阐明这一点.


Mar*_*ers 8

您没有改变字符串,只是将变量test重新指定为指向不同的字符串.原始字符串尚未修改.

  • 它们意味着更改字符串的单个字符,例如将"Hello,world!"更改为"Yello,world!",方法是将第一个字符更改为"Y"并保持其余字符不变.只有字符串才能执行此类操作例如,它们是可变的,因为它们在C中. (2认同)

Nie*_*tle 8

TEST和TEST2是*测试指针指向的两个不同的字符串.

您不是从第一行代码更改显式分配的NSString对象的内容,而是将*test指向另一个对象.