Value and Reference Collections

2018/10/20 posted in  iOS

值类型和引用类型的集合有所不同,看下图可知。

屏幕快照 2019-01-10 下午5.25.48

示例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前缀的是引用类型,引用类型只存在一份内存,因此改变一个值就会引起另一个值的改变,这个需要引起注意。