博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 5强制独占内存
阅读量:7221 次
发布时间:2019-06-29

本文共 1364 字,大约阅读时间需要 4 分钟。

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

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

为了更好地说明这个问题,我们可以考虑一个相当普遍的情况:修改一个函数的 inout 变量,这个函数执行了一个闭包,这个闭包使用同一作用域内的两个不同的名称访问上述的变量:

func modifyTwice(_ value: inout Int, by modifier: (inout Int) -> ()) {

modifier(&value)
modifier(&value)
}

func testCount() {

var count = 1
modifyTwice(&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) -> ()) {

modifier(&value)
modifier(&value)
}

func testCount() {

var count = 1
let increment = count
modifyTwice(&count) { $0 += increment }
print(count)
}
实际上,访问独占违规检查可能会被禁用,但强烈建议不要这样做:

虽然禁用运行时检查可能可以解决性能问题,但这并不意味着独占违规是安全的。如果没有启用强制执行,程序员必须遵守独占规则。

转载于:https://blog.51cto.com/14164498/2351165

你可能感兴趣的文章
git log显示
查看>>
JAVA——继承、多态、重载和重写---转
查看>>
(转)一点一点学ASP.NET-HttpHandler
查看>>
Sesame 2.7.0 发布,Java 的 RDF 开发包
查看>>
配置服务Ubuntu 嵌入式开发环境配置,交叉编译环境+tftp+minicom
查看>>
ibatis学习笔记
查看>>
函数元素AndroidInitProcess分析心得(3)
查看>>
ssh之雇员管理系统(2)-hibernate测试
查看>>
[转] JSON数据解析错误处理办法!
查看>>
c# 注册了Ctrl+空格为热键,捕获后发送Ctrl+Shift
查看>>
Android窗口浮在屏幕上效果
查看>>
今天做jquery遇到的一些问题汇总
查看>>
Arcgis中将栅格数据导出成Txt格式
查看>>
基于Predictive Parsing的ABNF语法分析器(五)——AbnfParser文法解析器之单字符的情形(如HTAB、LF、CR、SP)...
查看>>
每日英语:What Makes A Risk-Taker
查看>>
用VC实现发送和接收短信(操作AT指令)
查看>>
android-HttpClient和HttpURLConnection判断网络连接
查看>>
vi使用5
查看>>
html知识点总结
查看>>
POJ 1039 Pipe(直线和线段相交判断,求交点)
查看>>