Swift-内存访问冲突

内存访问冲突产生条件

  • 至少一个是写入操作
  • 它们访问的是同一块内存
  • 它们的访问时间重叠(比如在同一个函数内)

案例一

不存在访问冲突

1
2
3
4
5
func increment(_ num: inout Int) -> Int {
num + 1
}
var step = 1
step = increment(&step)

存在访问冲突

1
2
3
4
5
var step = 1
func increment(_ num: inout Int) {
num += step
}
increment(&step)

报错

如何解决

1
2
3
4
5
6
var step = 1
var copyOfStep = 1
func increment(_ num: inout Int) {
num += step
}
increment(&copyOfStep)

案例二


案例三

tulpe是一块结构体内存内存,所以修改内部的数据也会报错

解决方案

如果下面的条件可以满足,就说明重叠访问结构体的属性是安全的

  • 你只访问实例存储属性 ,不是计算属性或者类属性
  • 结构体是局部变量而非全局变量
  • 结构体要么没有被闭包捕获要么只被非逃逸闭包捕获
1
2
3
4
5
6
7
func test() {
var tulpe = (health: 10, energy: 20)
balance(&tulpe. health, &tulpe.energy)
var holly = Player (name: "Holly", health: 10, energy: 10)
balance(&holly.health, &holly, energy)
}
test()