You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:25:05