NSString作为引用传递的类,为何代码输出不符合预期?
为什么修改
copiedObjectiveCString后objectiveCString的值没变化? 嘿,这个问题其实是对引用类型的常见误解,咱们来拆解你的代码,把事儿说清楚:
先看你写的代码:
var objectiveCString : NSString? = "objectiveCString" var copiedObjectiveCString : NSString = objectiveCString!; copiedObjectiveCString = "changedobjectiveCString" print(copiedObjectiveCString); print(objectiveCString!)
你觉得NSString是引用类型,两个变量应该指向同一块内存,改一个另一个也得变,但实际结果却不是——核心问题在于:你根本没修改原来的NSString对象,而是给copiedObjectiveCString换了个全新的对象!
逐行分析:
- 第一行:
var objectiveCString : NSString? = "objectiveCString"
这里你创建了一个NSString实例,objectiveCString变量存的是指向这个实例的引用。 - 第二行:
var copiedObjectiveCString : NSString = objectiveCString!
这时候copiedObjectiveCString确实和objectiveCString指向同一个NSString实例,这点你没说错。 - 第三行:
copiedObjectiveCString = "changedobjectiveCString"
这一步不是修改原来那个NSString的内容,而是新建了一个NSString实例,然后把copiedObjectiveCString的引用改成指向这个新实例了。原来的objectiveCString还是指向最初的那个实例,所以它的值当然不会变。
想实现“改一个全变”该怎么做?
首先,NSString本身是不可变类——它的内容一旦创建就不能修改。如果要修改字符串内容,得用它的可变版本NSMutableString,比如:
var objectiveCString: NSMutableString = "objectiveCString" var copiedObjectiveCString: NSMutableString = objectiveCString copiedObjectiveCString.setString("changedobjectiveCString") // 这才是修改实例本身的内容 print(copiedObjectiveCString) // 输出 changedobjectiveCString print(objectiveCString) // 输出 changedobjectiveCString
这时候你是真的在修改同一个NSMutableString实例的内容,两个变量都指向它,所以输出就和你的预期一致了。
说白了,你之前的操作是“换对象”,而不是“改对象”,这就是结果不符合预期的原因~
内容的提问来源于stack exchange,提问作者Himan Dhawan
相关产品推荐
相关产品推荐

