- 理解内存访问冲突:当你代码的不同部份试图同时访问同一个内存地址时,就会产生内存访问冲突,有可能会引起不可预测的或者不一致的行为。
- 内存访问冲突的三个特征:当你有两个满足以下三个条件的内存访问时,就可能出现内存访问冲突。
- 至少有一个时写访问或者非原子访问。
- 它们访问内存的同一个地址。
- 它们的durations重叠。
- In-Out参数的访问冲突:函数对于它的in-out参数有长期访问权限。这导致你无法访问作为in-out参数传入的原始的变量。
- 把同一个变量传给一个函数的多个in-out参数也会引起内存访问冲突。
- 方法中访问self的冲突:结构体的可变方法在被调用时有对于self的写权限。
- 属性的访问冲突:结构体、元组和枚举等类型是由值构成的,比如结构体的属性或元组的元素。由于他们都是值类型,更改任何值都相当于更改整个值。
- 独占访问是比内存安全更高的要求,有些代码是内存安全但不是独占访问的。Swift允许编译器认为安全的内存安全但不是独占访问的代码。符合以下条件的重叠的结构体属性访问是安全的。
- 只访问实例的存储属性,而不访问计算属性或者类属性。
- 结构体是本地属性的值,而不是全局属性的。
- 该结构体不被任何闭包捕获,或者仅被非转译闭包捕获。