值类型和引用类型的集合有所不同,看下图可知。
示例1
let x = NSMutableArray()
x.add("🐵")
let y = x
y.add("🐶")
print(x,y)
//结果
(
"🐵",
"🐶"
) (
"🐵",
"🐶"
)
示例2
var x:[String] = []
x.append("🐵")
var y = x
y.append("🐶")
print(x,y)
//结果
["🐵"] ["🐵", "🐶"]
打印内存地址,探究 x 和 y 内存指向空间的关系。
示例3
var x:[String] = []
x.append("🐵")
let xaddress = String(format: "%p", x)
print("xaddress===\(xaddress)")
var y = x
let yaddress = String(format: "%p", y)
print("yaddress===\(yaddress)")
y.append("🐶")
print("yaddress===\(yaddress)")
//结果
xaddress===0x600000434640
yaddress===0x6000004346a0
yaddress===0x6000004346a0
示例4
let x = NSMutableArray()
x.add("🐵")
let xaddress = String(format: "%p", x)
print("xaddress===\(xaddress)")
let y = x
let yaddress = String(format: "%p", y)
print("yaddress===\(yaddress)")
y.add("🐶")
print("yaddress===\(yaddress)")
//结果
xaddress===0x6000004508c0
yaddress===0x6000004508c0
yaddress===0x6000004508c0
示例3中的 var y = x
会使y开辟一个新的内存空间,内容是复制x的内容,y添加元素,从而不会影响到 x。
但是示例4对于 let y = x
没有开辟新的内存空间 还是指向同一块区域,所以当 y 发生改变的时候 x 的值也发生了改变。
结语
NS前缀的是引用类型,引用类型只存在一份内存,因此改变一个值就会引起另一个值的改变,这个需要引起注意。