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

Swift iOS中这段简单代码为何会崩溃?

Swift iOS中这段简单代码为何会崩溃?

哈哈,这个问题我刚看到的时候也懵了——看起来完全人畜无害的一行代码,居然直接触发运行时崩溃,实在有点反直觉!

先帮你理清楚问题的核心:你写的这段链式代码,其实触发了Swift的内存排他访问检查,咱们一步步拆解来看:

首先看你崩溃的代码:

var dictionary: [String: String]? = [:]

override func viewDidLoad() {
    super.viewDidLoad()

    dictionary?["key"] = dictionary?["key"] ?? "test"
}

运行时抛出的错误是:

Thread 1: Simultaneous accesses to 0x10ce01360, but modification requires exclusive access

为啥会这样?其实dictionary?["key"]这个操作,背后是先对可选类型dictionary做了一次隐式的可选绑定(相当于偷偷做了if let dict = dictionary { ... }),然后调用字典下标的getter方法获取值。而你在同一个表达式里,又用dictionary?["key"] = ...调用了下标的setter方法去修改值。

Swift的内存安全规则要求:对变量的写入操作必须是排他的,不能和同一块内存的读取/写入操作同时发生。虽然你的代码看起来是“先读再写”,但在同一个表达式里,编译器/运行时没办法保证这两个操作的执行顺序是完全串行、没有重叠的——它会判定为“同时访问同一块内存”,为了避免数据竞争的风险,就直接触发崩溃了。

而你分开写的两行代码就没问题:

let currentValue = dictionary?["key"]
dictionary?["key"] = currentValue ?? "test"

因为第一行已经把读取操作完全完成,结果存在了临时变量currentValue里,这时候和dictionary的内存访问就结束了;第二行的写入操作是独立的,不存在同时访问的情况,自然就通过了内存检查。

所以这不是Swift的bug,反而是它内存安全机制严格的体现——哪怕看起来代码逻辑上是串行的,但只要编译器无法确保操作的排他性,就会触发保护机制。这种设计是为了从根源上避免多线程或者复杂表达式里的数据竞争问题,只是在这种简单场景下显得有点“小题大做”而已。

备注:内容来源于stack exchange,提问作者Kevin DiTraglia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 08:40:26