swift 内存安全

368 阅读2分钟

这是我参与更文挑战的第25天,活动详情查看: 更文挑战

内存安全

默认情况下,Swift 会阻止代码中发生的不安全行为。比如说,Swift会保证在使用前就初始化,内存在变量释放后这块内存就不能再访问了,以及数组会检查越界错误

Swift 还通过要求标记内存位置来确保代码对内存有独占访问权,以确保了同一内存多次访问时不会冲突。由于 Swift 自动管理内存,大部份情况下你根本不需要考虑访问内存的事情。如果代码存在内存访问冲突,编译时或运行时会报错


内存访问冲突

内存的访问,会发生在你给变量赋值,或者传递参数给函数时。

下面的代码就包含了读和写的访问:

// 写入访问
var one = 1
 
// 读取访问
print(“We’re number \(one)!”)

内存访问冲突会在从不同地方,同一时间尝试访问同一块内存时发生。在同一时间多处访问同一块内存会产生不可预料或者说不一致的行为。在 Swift 中,有好几种方式来修改跨越多行代码的值,从而可以在访问值的中间进行它自身的修改。


内存访问性质

  • 内存访问冲突时,要考虑内存访问上下文中的这三个性质:

    • 访问是读还是写
    • 访问的时长
    • 被访问的存储地址。
  • 当有两个内存访问符合下列的情况就会引起内存访问冲突:

    • 至少有一个是写访问
    • 它们访问的是同一个存储地址
    • 它们的访问在时间线上部分重叠
  • 读和写访问的区别很明显

    • 一个写访问会改变存储地址,而读操作不会。
    • 存储地址是指向正在访问的东西(例如一个变量,常量或者属性)的位置的值 。
    • 内存访问的时长要么是瞬时的,要么是长期的。
  • 如果一个访问不可能在其访问期间被其它代码访问,那么就是一个瞬时访问。正常来说,两个瞬时访问是不可能同时发生的。大多数内存访问都是瞬时的。