属性内存访问安全, 关于 inout 使用
2020-08-21 本文已影响0人
幸运者_Lucky
前提: 关于 inout 使用
在同时访问同一个存储属性, 肯定会造成安全问题.
在同时访问结构体的两个不同属性:
- 使用存储属性, 不会造成问题, 计算属性, 类属性, 静态变量会造成问题.
- 局部变量不会造成问题, 全局变量会造成问题.
- 没有被闭包捕获, 或只被非逃逸闭包捕获.
有结构体 A
struct A {
var a = 10
var b = 20
func run( aa: inout Int, bb: inout Int) {
aa = 5
bb = 5
}
}
test1: 当初始化 A 为全局变量
var a = A()
a.run(aa: &a.a, bb: &a.b)
print(a)
// error
Simultaneous accesses to 0x1094582c0, but modification requires exclusive access.
Previous access (a modification) started at (0x1094593e4).
Current access (a modification) started at
test2: 当初始化 A 为局部变量
func run() {
var a = A()
a.run(aa: &a.a, bb: &a.b)
print(a)
}
run()
// print
A(a: 5, b: 5)
test3: 逃逸闭包持有这个属性
var holder: (() -> ())?
func run() {
var a = A()
holder = {
print(a)
}
a.run(aa: &a.a, bb: &a.b)
print(a)
}
run()
// error
Simultaneous accesses to 0x60000294f230, but modification requires exclusive access.
Previous access (a modification) started at (0x105ea18be).
Current access (a modification) started at