有哪些网站做汽车周边服务,网站优化推广方法,安徽省六安市城乡建设厅网站,免费虚拟云主机Swift 5将带来改进的Swift程序内存安全性#xff0c;在程序的其他部分修改变量时#xff0c;不允许通过其他变量名来访问这些变量。这个变更对现有应用程序的行为和Swift编译器本身都有重要影响。Swift 5将带来改进的Swift程序内存安全性#xff0c;在程序的其他部分修改变量…Swift 5将带来改进的Swift程序内存安全性在程序的其他部分修改变量时不允许通过其他变量名来访问这些变量。这个变更对现有应用程序的行为和Swift编译器本身都有重要影响。Swift 5将带来改进的Swift程序内存安全性在程序的其他部分修改变量时不允许通过其他变量名来访问这些变量。这个变更对现有应用程序的行为和Swift编译器本身都有重要影响。
在多种情况下会发生独占内存访问问题。编译器可以静态地捕获大部分问题剩下的只能在运行时处理。只能在运行时处理的问题包括具有转义闭包、类类型属性、静态属性和全局变量的排他性违规。
为了更好地说明这个问题我们可以考虑一个相当普遍的情况修改一个函数的inout变量这个函数执行了一个闭包这个闭包使用同一作用域内的两个不同的名称访问上述的变量
func modifyTwice(_ value: inout Int, by modifier: (inout Int) -\u0026gt; ()) { modifier(\u0026amp;value) modifier(\u0026amp;value)}func testCount() { var count 1 modifyTwice(\u0026amp;count) { $0 count } print(count)}
在这个例子中因为使用count同时作为modifyTwice和modifier的inout参数所以出现了问题。我们不清楚print语句应该打印出什么内容。第一次count变量递增它的值递增到2。但是当执行第二次加法时要添加到$0的count值是多少这可能取决于很多因素因为内存操作不一定是瞬时的。更糟糕的是编译器可能会引入优化进一步使这种情况复杂化。
这个问题不仅与通过不同变量名同时修改内存的不可预测性有关也与编译器的复杂性有关。
这可能会导致意外和混乱的结果。它还导致编译器和标准库的实现具有很大的保守性它们通常必须确保程序的基本可靠性没有崩溃或未定义的行为即使是在不寻常的情况下。
所有这些意味着如果发现独占访问冲突使用Swift 5编译器编译的应用程序将在运行时崩溃。这个行为以前在Swift 4编译器调试模式下可用因此仅在运行时模式下测试过的程序在使用Swift 5编译时有崩溃的风险。Swift 4编译器可用因此仅在运行时模式下测试的程序在使用Swift 5编译时可能会崩溃。
修复访问独占违规的一般方法是复制数据。在我们的示例中这将归结为
func modifyTwice(_ value: inout Int, by modifier: (inout Int) -\u0026gt; ()) { modifier(\u0026amp;value) modifier(\u0026amp;value)}func testCount() { var count 1 let increment count modifyTwice(\u0026amp;count) { $0 increment } print(count)}
实际上访问独占违规检查可能会被禁用但强烈建议不要这样做
虽然禁用运行时检查可能可以解决性能问题但这并不意味着独占违规是安全的。如果没有启用强制执行程序员必须遵守独占规则。查看英文原文https://www.infoq.com/news/2019/02/swift-5-exclusive-memory-access