Swift 基础

属性内存访问安全, 关于 inout 使用

2020-08-21  本文已影响0人  幸运者_Lucky

前提: 关于 inout 使用

在同时访问同一个存储属性, 肯定会造成安全问题.

在同时访问结构体的两个不同属性:

  1. 使用存储属性, 不会造成问题, 计算属性, 类属性, 静态变量会造成问题.
  2. 局部变量不会造成问题, 全局变量会造成问题.
  3. 没有被闭包捕获, 或只被非逃逸闭包捕获.

有结构体 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
上一篇 下一篇

猜你喜欢

热点阅读