swift 内存访问冲突

105 阅读1分钟
内存访问冲突会在两个访问满足下列条件时发生:
至少一个是写入操作
它们访问的是同一块内存
它们的访问时间重叠(比如在同一个函数内)

不会冲突

如果下面的条件可以满足,就说明重叠访问结构体的属性是安全的 

口你只访问实例存储属性,不是计算属性或者类属性

 口结构体是局部变量而非全局变量 结构体要么没有被闭包捕获要么只被非逃逸闭包捕获

Swift中也有专门的指针类型,这些都被定性为 “Unsafe〞(不安全的),常见的有以下4种类型 

口 UnsafePointerePointee> 类似于 const Pointee * 

口 Unsa feMutab lePointer 类似于 Pointee * 

O UnsafeRawPointer 类似于 const void

 口 Unsa feMutab leRawPointer 类似于 void *

    func test1(_ num: UnsafeMutablePointer<Int>) {
        num.pointee += 100
    }
    func test2(_ num: UnsafePointer<Int>) {
        print(num)
    }
    
    func test3(_ num: UnsafeMutableRawPointer) {
//        num.pointee += 100
        let n = num.load(as: Int.self)
        print(n)
    }
        var num = 12
//        test1(&num)
        test3(&num)

    

        var num = 12
        var numPoint = withUnsafeMutablePointer(to: &num) { $0 }
        withUnsafePointer(to: &num) { (p)->UnsafePointer<Int> in
            return p
        }
        
        withUnsafePointer(to: &num, {UnsafeRawPointer($0)})
        withUnsafePointer(to: &num, {UnsafeMutableRawPointer($0)})