是NSString值一旦提供了值就无法更改?

时间:2012-04-23 04:30:08

标签: iphone objective-c cocoa

您好我得到的信息是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 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

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

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

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

你可以使指针const和字符串不可变,如下所示:

NSString * const aStr = @"aStr";

答案 2 :(得分:4)

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

答案 3 :(得分: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(实际上现在我认为它在这种情况下也会起作用 - 但它不是真正的惯用语。)

您可以通过向s2发送保留消息使s1或s3等效于s2。你也可以通过发送一个autorelease消息将s2变成一个等价的对象。