内存访问冲突会在两个访问满足下列条件时发生
1.至少一个是写入操作
2.他们访问的是同一块内存
3.他们的访问时间重叠(比如在同一个函数内)
不存在内存访问冲突
//不存在内存访问冲突
func plus(_ num: inout Int) -> Int {
return num + 1
}
var number = 1
number = plus(&number)
存在内存访问冲突
var step = 1
func increment(_ num: inout Int) {
num += step
}
increment(&step)
func balance(_ x: inout Int, _ y: inout Int) {
let sum = x + y
x = sum / 2
y = sum - x
}
var num1 = 42
var num2 = 30
balance(&num1, &num2)
balance(&num1, &num1)

错误信息.png
解决内存访问冲突
var step = 1
func increment(_ num: inout Int) {
num += step
}
var copyOfStep = step
increment(©OfStep)
step = copyOfStep
如果下面的条件可以满足,说明重叠访问结构体的属性是安全的
- 只访问实例存储属性 不是计算属性或者类属性
- 结构体是局部变量而非全局变量
- 结构体要么没有被闭包捕获要么只被非逃逸闭包捕获
网友评论