美文网首页Swift 基础
属性内存访问安全, 关于 inout 使用

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

作者: 幸运者_Lucky | 来源:发表于2020-08-21 11:20 被阅读0次

    前提: 关于 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
    

    相关文章

      网友评论

        本文标题:属性内存访问安全, 关于 inout 使用

        本文链接:https://www.haomeiwen.com/subject/tjcujktx.html