Swift 5逼迫独占内存
更新时间:2019-02-21

在这个例子中,因为使用 count 同时作为 modifyTwice 和 modifier 的 inout 参数,所以浮现了问题。我们不清楚 print 语句应该打印出什么内容。第一次 count 变量递增,它的值递增到 2。然而,当执行第二次加法时,要增添到 $0 的 count 值是多少?这可能取决于很多因素,由于内存操作不一定是刹时的。更蹩脚的是,编译器可能会引入优化,进一步使这种情况庞杂化。

modifier(&value)

Swift 5 将带来改进的 Swift 程序内存安全性,在程序的其余部分修改变量时,不允许通过其余变量名来访问这些变量。这个变更对现有应用程序的行为和 Swift 编译器本身都有重要影响。

}

modifyTwice(&count) { $0 += count }

func testCount() {

modifyTwice(&count) { $0 += increment }

var count = 1

func testCount() {

modifier(&value)

这个问题不仅与通过不同变量名同时修改内存的不可猜想性有关,也与编译器的复杂性有关。

modifier(&value)

修复访问独有违规的个别方法是复制数据。在咱们的示例中,这将演绎为:func modifyTwice(_ value: inout Int, by modifier: (inout Int) -> ()) {

modifier(&value)

这可能会导致意外跟混乱的结果。它还导致编译器跟标准库的实现存在很大的保守性,它们通常必需确保程序的基本坚固性(不瓦解或未定义的行动),即使是在不寻常的情形下。

诚然禁用运行时检查可能可能解决性能问题,但这并不象征着独占违规是保险的。如果不启用逼迫实行,程序员必须按照独占规则。

var count = 1

}

Swift 4 编译器可用,因而仅在运行时模式下测试的程序在使用 Swift 5 编译时可能会崩溃。

所有这些象征着假如发现独占访问抵牾,应用 Swift 5 编译器编译的应用程序将在运行时崩溃。这个举动以前在 Swift 4 编译器调试模式下可用,因此,仅在运行时模式下测试过的程序在使用 Swift 5 编译时有崩溃的危险。

}

为了更好地说明这个问题,咱们能够考虑一个相当普遍的情况:修正一个函数的 inout 变量,这个函数履行了一个闭包,这个闭包利用同一作用域内的两个不同的名称拜访上述的变量:func modifyTwice(_ value: inout Int, by modifier: (inout Int) -> ()) {

在多种情况下会发生独占内存访问问题。编译器可以静态地捕获大部分问题,剩下的只能在运行时处理。只能在运行时处置的问题包括具备转义闭包、类类型属性、静态属性和全局变量的排他性违规。

print(count)

}

实际上,访问独占违规检讨可能会被禁用,但强烈倡导不要这样做:

print(count)

let increment = count