0

嗨,我得到一个信息,即 NSString 值是不可变的,一旦提供了值就无法更改。

但我已经创建并测试了以下代码:

NSString *str=[[NSString alloc] initWithString:@"Hello"];    
NSLog(@"\n\nstr = %@",str);
str=@"asdasd";
NSLog(@"\n\n new str = %@",str);

这将“Hello”作为第一个 str 值,将“asdasd”作为第二个 str 值。如果是这样,调用 NSString 不可变有什么意义?提前致谢。

4

4 回答 4

10

您在第三行所做的只是创建一个新字符串并用 str 变量指向它。您没有更改原始字符串,而是使变量指向新字符串。

于 2012-04-23T04:32:15.230 回答
5

NSString是不可变的。你不能改变它。您的困惑源于您的变量(指针)不是const.

您所做的只是将指针重新分配给不同的不可变字符串。

如果您要尝试将字符串附加到其中一个,则会出现错误。具体来说,这是“……调用 NSString 不可变的相关性”。您应该将此解释为字符串实例可能不会发生变异,即使您声明的变量可能会被分配另一个 NSString 实例,因为它不是const.

您可以像这样使指针 const 和字符串不可变:

NSString * const aStr = @"aStr";
于 2012-04-23T04:35:07.187 回答
4

您混淆了不可变对象和常量指针(加上您正在泄漏内存)。在这里,您并没有真正改变 NSString实例(即对象本身),而只是一个指向它的指针。关键是您可以将 NSString 的不同实例分配给同一个变量,它不会改变对象的内部内容,也不会使其响应 NSMutableString 的变异消息等appendString

于 2012-04-23T04:33:08.340 回答
1

使用它可以解决您的问题...

NSString *str=[NSString stringWithFormat:@"Hello"];    
NSLog(@"\n\nstr = %@",str);
str = nil;
str=@"asdasd";
NSLog(@"\n\n new str = %@",str);

这是你应该知道的一些基本知识..

NSString *s1 = @"string1";
NSString *s2 = [[NSString alloc] initWithString:@"string2"];
NSString *s3 = [NSString stringWithFormat:@"string3"];

在这种情况下,s1 是一个指向常量字符串的指针。s2 和 s3 都指向您创建的新字符串,但 s2 已为您保留,s3 已自动释放。如果您只需要一个临时对象,自动释放对象 s3 或常量对象 s1 是不错的选择。如果您需要保留字符串,则应该使用 s2 (实际上,现在我认为 s1 在这种情况下也可以使用-尽管它并不是真正的惯用语)。

您可以通过向 s1 或 s3 发送保留消息来使 s1 或 s3 等效于 s2。您还可以通过发送自动释放消息将 s2 转换为等效对象。

于 2012-04-23T04:38:36.260 回答