You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:18:20