内存访问冲突会在两个访问满足下列条件时发生:
至少一个是写入操作
它们访问的是同一块内存
它们的访问时间重叠(比如在同一个函数内)
不会冲突
如果下面的条件可以满足,就说明重叠访问结构体的属性是安全的
口你只访问实例存储属性,不是计算属性或者类属性
口结构体是局部变量而非全局变量 结构体要么没有被闭包捕获要么只被非逃逸闭包捕获
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)})