Swift函数使用多个inout参数时应用崩溃问题咨询
解决Swift中"Simultaneous accesses"崩溃问题
你遇到的这个崩溃是Swift的内存独占访问检查导致的,咱们先拆解代码里的核心问题:
在你的changeChar函数中,你接收了char1: inout Character参数(对应外部全局变量char的引用),但函数内部却错误地直接修改了全局变量char,而非传入的参数char1。这就导致同一内存地址被同时以两种方式访问:
- 一种是
inout参数要求的独占访问权 - 另一种是直接修改全局变量的访问操作
这种情况违反了Swift的内存安全规则,所以触发了"Simultaneous accesses"崩溃。
最直接的解决方案
修改函数内部的赋值目标,使用传入的inout参数而非全局变量:
var char : Character = "1" var char2 : Character = "1" func changeChar( char1: inout Character,char2: inout Character) { char1 = "b" // 改为操作传入的char1参数,而非全局char char2 = "b" } override func viewDidAppear(_ animated: Bool) { print(char,char2) changeChar(char1: &char, char2: &char2) print(char,char2) }
这样函数会正确修改你传入的两个变量,同时不会触发内存访问冲突。
为什么会出现这个问题?
Swift的内存安全模型规定:当你要修改一个变量时,必须拥有它的独占访问权。当你把&char传给inout参数时,函数会暂时获得这个变量的独占访问权;但此时你在函数内部直接修改全局的char,相当于绕过了inout的独占访问控制,同时对同一内存地址进行操作,自然会触发崩溃。
如果你的业务逻辑确实需要在函数中操作全局变量,那不要将同一个变量作为inout参数传入,或者先创建局部拷贝再操作,不过对于你的代码场景,第一种方案显然是最合理的。
内容的提问来源于stack exchange,提问作者Pratik Prajapati
相关产品推荐
相关产品推荐

