M1芯片MacBook Air的Xcode模拟器Swift 5 UserDefaults不生效问题求助
M1芯片Mac Xcode模拟器UserDefaults偶发读写异常解决方案
该问题根因为M1架构Mac运行旧版Xcode模拟器时,UserDefaults的异步磁盘同步逻辑存在兼容缺陷,写入操作的内存缓存和磁盘存储没有及时同步,导致读取偶发失效,真机及Intel架构Mac不存在该兼容问题。
可通过以下方案解决:
- 写入操作后主动触发同步
写入值后额外调用synchronize()方法强制立即同步,虽然iOS 14之后官方标记该方法废弃无需主动调用,但针对M1模拟器的该bug该方法可以100%触发缓存刷新,修改后的写入代码如下:UserDefaults.standard.setValue("my string", forKey: "UserEmail") UserDefaults.standard.synchronize() - 强制模拟器以x86_64架构运行
打开项目配置,依次进入「TARGETS」-> 你的App目标 ->「Build Settings」,搜索Excluded Architectures,在Debug模式的「Any iOS Simulator SDK」配置项中添加arm64,强制模拟器通过Rosetta转译运行,规避arm64架构下的兼容bug。 - 升级Xcode到最新正式版
该兼容问题已经在Xcode 14.3及后续版本官方修复,升级Xcode到最新版本即可直接解决问题,无需修改业务代码。 - 临时调试方案
如果暂时不想修改配置和代码,写入操作后延迟150ms左右再执行读取操作,避开异步同步的时间差即可读取到正确值,该方案仅适用于本地调试,不建议在线上代码使用。
内容的提问来源于stack exchange,提问作者Yogesh Patel
相关产品推荐
相关产品推荐

