NSString immutable allows to change its values?

天大地大妈咪最大 提交于 2019-11-29 10:52:51

Perhaps the following example will add upon the replies from Mark and Niels and help clarify things.

Immutable strings

// 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);

Mutable strings

// 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);

Notice when you use the immutable NSString class that the only way to "replace" a string is to create a new string and update your variable "str2" to point to it. This however doesn't affect what "str1" is pointing to, so it will still reference the original string.

In the NSMutableString example, we don't create a second string, but instead alter (mutate) the contents of the existing "Hello World" string. Since both variables continue to point to the same string object, they will both report the new value in the call to NSLog.

It's important to differentiate between a pointer variable and the actual object it points to. A NSString object is immutable, but that doesn't stop you from changing the value of a variable which points to a string.

The data type "NSString *" is a pointer to a NSString object, not the object itself. If you set a break point at either of the NSLog statements within the XCode debugger, you may like to check the raw value of each variable to clarify this.

You aren't mutating the string, you are just reassigning the variable test to point to a different string. The original string hasn't been modified.

TEST and TEST2 are two different strings pointed to by the *test pointer.

You are not changing the contents of the explicitly allocated NSString object from the first line of code but pointing *test to another object.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!