当前位置:  开发笔记 > IOS > 正文

关于NSStrings的最后一句话:可变和不可变

如何解决《关于NSStrings的最后一句话:可变和不可变》经验,为你挑选了2个好方法。

我已经阅读了几本书......以及在线...关于不可变和可变的字符串.他们声称"不可变的字符串"无法改变.(但他们从未定义"变化".)

如果不使用NSMutableString,可以更改哪些NSStrings?

该字符串包含"鲶鱼"......后来我尝试将其更改为"cat".(相同的字母,只是更短.)

它包含"猫"......我试图将其改为"鲶鱼".(类似的开始...但只是做得更久.)

我将"猫"改为"CAT".(相同的字母,但情况已经改变.)

我把"猫"变成了"狗".(完全不同的字符串,但长度相同.)

我将"猫"改为"山茱萸".(完全不同的字符串,但更长.)



1> Marc Novakow..:

答案是 - 没有.不可变意味着它不能变成与原始字符串不同的任何东西.每个角色保持不变,长度不能改变等等.一旦定义了你就不能改变关于那个字符串的任何东西.如果要使其更长或更短或更改任何字符,则需要创建一个新字符串(或使用NSMutableString开头).


@BettyT:您将对象的不变性与分配给指向对象的变量的能力混淆.如果对象没有允许更改其状态的方法,则该对象是不可变的.如果将变量设置为指向不可变对象,则仍可以将变量设置为随时指向任何其他对象.对象是不可变的意味着你知道一旦你指向一个对象,它的状态就不会以某种方式改变(例如,也有一个也有一个指向同一个对象的变量的其他人).PS NSNumber对象也是不可变的,但并非无用.
为了扩展newacct的注释,在Objective-C中区分变量和对象非常重要.任何数量的变量都可以指向同一个对象.以后可以将这些变量中的任何一个重新分配给新对象,而不会影响任何其他变量.另一方面,如果对象本身发生了变异,则代码中每个带有指向对象的变量的位置都可以看到对象的更改.让一个物体从你的下方改变,这通常是不可取的.

2> mouviciel..:

如果我声明一个变量:

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];

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有