Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSString的最后一个词:可变和不可变_Objective C_Cocoa_Cocoa Touch_Immutability_Mutable - Fatal编程技术网

Objective c NSString的最后一个词:可变和不可变

Objective c NSString的最后一个词:可变和不可变,objective-c,cocoa,cocoa-touch,immutability,mutable,Objective C,Cocoa,Cocoa Touch,Immutability,Mutable,我读过好几本书。。。和在线。。。关于不可变和可变字符串。 他们声称“不可变字符串”无法更改。 (但他们从不定义“改变”。) 在不使用NSMutableString的情况下,哪些NSString可以更改 字符串包含“鲶鱼”。。。后来我试着把它改成“猫”。 (相同的字母,只是更短。) 它包含“猫”。。。我试着把它改成“鲶鱼”。 (类似的开始……但只是延长了时间。) 我把“猫”改成“猫”。 (字母相同,但只是大小写发生了变化。) 我把“猫”改成“狗”。 (完全不同的字符串,但长度相同。) 我把“猫”改

我读过好几本书。。。和在线。。。关于不可变和可变字符串。 他们声称“不可变字符串”无法更改。 (但他们从不定义“改变”。)

在不使用NSMutableString的情况下,哪些NSString可以更改

字符串包含“鲶鱼”。。。后来我试着把它改成“猫”。 (相同的字母,只是更短。)

它包含“猫”。。。我试着把它改成“鲶鱼”。 (类似的开始……但只是延长了时间。)

我把“猫”改成“猫”。 (字母相同,但只是大小写发生了变化。)

我把“猫”改成“狗”。 (完全不同的字符串,但长度相同。)

我把“猫”改成“山茱萸”。
(完全不同的字符串,但更长。)

答案是-无。不可变意味着不能将其更改为与原始字符串不同的任何内容。每个字符都保持不变,长度不能更改,等等。一旦定义了它,就不能更改该字符串的任何内容。如果要使其变长或变短或更改任何字符,则需要创建一个新字符串(或使用NSMutableString作为开头)。

还需要定义“更改:)

基本上,当您创建一个NSString时,您正在创建一个字符数组,并告诉编译器该数组的内容永远不会更改。“永不改变”部分是“不变”部分;无法修改字符串包含的数据

另一方面,NSMutableString允许您实际更改它指向的数据(因此它是“可变的”)。注意NSMutableString中存在的“appendString”方法;这实际上会获取数据并将其拍打到字符串的末尾

例如,如果您有:

NSString*myString=@“Cat”; myString=@“金鱼”

那很好。您从未真正更改myString包含的数据;您只是告诉它您希望它指向一段新的不可更改的数据

唯一一次你真正遇到可变和不可变对象之间差异的问题是,如果你试图直接修改myString(例如,在myString后面附加“s are cool”之类的东西)

换句话说,任何一个类都允许您将任何字符串“更改”为任何其他字符串,但是您使用的方法将非常不同。例如,要使用可变字符串将“cat”转换为“cat”,您可以迭代每个字符并将其改为大写(因为您可以修改可变字符串的内容)。另一方面,对于不可变字符串,您必须首先将原始字符串复制到其他地方,修改它,然后重定向变量以指向这个新字符串

以下链接可能有用:


我还建议做一些谷歌搜索;这是一个与总体发展相关的问题,也是一个需要把握的相对重要的概念。互联网上其他地方也讨论过这个问题。

如果我声明一个变量:

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];
不可变字符串(或者任何不可变对象)是初始化后根本无法更改的字符串

在(伪)伪代码中使用不可变字符串的优点如下:

// if using mutable strings
let a = "Hello World";
let b = a;
a.replace("Hello", "Goodbye");
现在a代表什么?“你好,世界”?“再见,世界”? b代表什么

如果字符串是可变的,那么它可能包含“再见世界”。这可能是你想要的。可能不是

对于不变性,很明显b仍然指向原始字符串,因为replace方法不能更改实际字符串,而是返回了对新字符串的引用


在这个例子中,您可能看不到多少好处。但是,如果在代码的不同部分或不同线程中引用和使用a和b,则具有不可变引用会删除许多潜在错误。

NSString无法编辑,每次将字符串值指定给NSString对象时,它都将孤立旧字符串对象并重新创建新字符串对象。如果您处理的是大字符串缓冲区,那么这是一个昂贵的操作。如果您处理的是大字符串缓冲区,那么请使用NSMutableString以获得最佳性能。这类似于.net中的字符串与stringBuilder。

默认情况下,在objective C语言中使用的NSString是不可变的。NSMutableString用于声明和定义可变字符串。不可变字符串中的任何内容都不能更改。不是长度,不是字符,什么都没有。

谢谢您的快速回复。这难道不意味着NSString毫无用处吗?我将变量设置为NSString值。。。然后我再也不能改变它了。这在其他语言中不是通常被称为“常量”吗?99%的时间里,我可能想用我的刺“做点什么”。所以我不应该在任何地方都使用MSMutableString吗?(但与非常常用的NSString相比,我很少看到它被使用。)想象一下,如果int/float/long也是不可变的。int x=5;那么x永远不会改变。不变的(几乎)是无用的。不,“做点什么”可能仅仅意味着从某个数据存储中读取并显示它们。在这种情况下,您不想修改它们。@BettyT:您将对象的不变性与分配给指向对象的变量的能力混淆了。如果对象没有允许更改其状态的方法,则该对象是不可变的。如果将变量设置为指向不可变对象,则仍然可以随时将变量设置为指向任何其他对象。对象是不可变的意味着您知道,一旦您指向一个对象,它的状态将不会以某种方式改变(例如,其他人也有一个v