我在几本书中读过......在线...关于不可变和可变的字符串。 他们声称“不可变的字符串”无法改变。 (但他们从不定义“变化”。)
如果不使用NSMutableString,可以更改哪些NSStrings?
该字符串包含“鲶鱼”......后来我尝试将其更改为“cat”。 (相同的字母,只是更短。)
它包含“猫”......我尝试将其更改为“鲶鱼”。 (类似的开始...但只是做得更久。)
我将“cat”改为“CAT”。 (相同的字母,但情况已经改变。)
我将“猫”改为“狗”。 (完全不同的字符串,但长度相同。)
我将“猫”变成“山茱萸”。 (完全不同的字符串,但更长。)
答案 0 :(得分:20)
答案是 - 没有。不可变意味着它不能更改为与原始字符串不同的任何。每个角色保持不变,长度不能改变等等。一旦定义了你就不能改变关于那个字符串的任何东西。如果你想使它更长或更短或更改任何字符,你需要创建一个新的字符串(或使用NSMutableString开始)。
答案 1 :(得分:11)
如果我声明一个变量:
NSString * var;
// Here some code giving a new value to var
什么是不可变的是var
指向的对象,而不是var
本身。
这意味着我无法更改var
指向的任何对象,但我可以更改指向的对象。
var
允许您提及的所有操作,但您可以为var
分配另一个不同的字符串:
NSString * anotherVar;
// Here some code giving a new value to anotherVar
var = anotherVar; // This is allowed (with a memory leak if GC is disabled)
// The following is also allowed: -stringWithFormat: creates a new object
var = [var stringWithFormat:@"%@ with more chars", var];
答案 2 :(得分:3)
无法编辑NSString,每次为NSString对象分配字符串值时,它都会孤立旧字符串对象并重新创建新的字符串对象。如果你正在处理大字符串缓冲区,这是一个昂贵的操作。如果您正在处理大型字符串缓冲区,请使用NSMutableString以获得最佳性能。这类似于.net。中的string vs stringBuilder。
答案 3 :(得分:2)
您还需要定义“更改”:)
基本上,当你创建一个NSString时,你正在创建一个字符数组,并告诉编译器 所述数组的内容永远不会改变。 “永不改变”的部分是“不可改变的”部分;字符串包含的数据无法修改。
另一方面,NSMutableString允许您实际更改它指向的数据(因此它是“可变的”)。注意NSMutableString存在的'appendString'方法;这实际上需要数据并将其打到字符串的末尾。
例如,如果你有:
NSString * myString = @“Cat”; myString = @“金鱼”;
这样可以正常工作。你永远不会真正改变myString包含的数据;你只是告诉它你希望它指向一个新的不可更改数据段。
你实际遇到可变对象和不可变对象之间的差异的唯一一次是你是否试图直接修改myString(例如对它添加“s很酷”)。
换句话说,任何一个类都允许您将任何字符串“更改”为任何其他字符串,但您用来执行此操作的方法将会非常不同。例如,要使用可变字符串将“cat”变为“CAT”,您可以迭代每个字符并简单地将其设为大写(因为您可以修改可变字符串的内容)。另一方面,使用不可变字符串,您必须先将原始字符串复制到其他位置,修改它,然后将变量重定向到指向此新NSString。
以下链接可能有用: http://www.kirupa.com/forum/showthread.php?t=307928 http://forums.macrumors.com/showthread.php?t=467099
我还建议做一些谷歌搜索;这是一个与发展有关的问题,这是一个相对重要的概念。它也被在互联网上的其他地方讨论过死亡。
答案 4 :(得分:2)
不可变字符串(或者实际上,任何不可变对象)是在初始化之后根本无法更改的字符串。
这是在(伪)伪代码中使用不可变字符串的优点:
// if using mutable strings
let a = "Hello World";
let b = a;
a.replace("Hello", "Goodbye");
现在举办什么? “你好,世界”? “世界再见”? 现在b持有什么?
如果字符串是可变的,那么它可能会保持“再见世界”。这可能就是你想要的。它可能不是。
由于不变性,很明显b仍然指向原始字符串,因为replace方法不能更改实际字符串,而是返回对新字符串的引用。
在这个例子中你可能看不到多少好处。但是如果a和b在代码的不同部分或不同的线程中被引用和使用,那么使用不可变引用会消除很多潜在的错误。
答案 5 :(得分:1)
默认情况下,目标C语言中使用的NSString是不可变的。 NSMutableString用于声明&定义一个可变字符串。不可变字符串中的任何内容都不能更改。不是长度,不是人物,没有。