内存访问冲突产生条件
- 至少一个是写入操作
- 它们访问的是同一块内存
- 它们的访问时间重叠(比如在同一个函数内)
案例一
不存在访问冲突
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(©OfStep)
|
案例二
案例三
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()
|