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

Swift JSONEncoder内存泄漏:iOS登出后序列化数据仍留存在内存中

JSONEncoder序列化后敏感数据残留内存的问题排查

问题背景

对应用内存执行debug模式下的memory dump后,发现登出应用后内存中仍保留了不应存在的敏感数据。经排查,残留数据是通过Alamofire发送的完整JSON数据。为验证问题,制作测试应用,通过按钮触发以下代码:

func encodeJson() {
    let encoder = JSONEncoder()
    
    var dic: [String: String] = [
        "email": "someMail@email.com",
        "password": "somePassord",
        "appName": "test app",
        "version": "1.1.1",
        "os": "ios",
    ]
    
    
    do {
        let data = try encoder.encode(dic)
        dic = [:]
    } catch {
        
    }
    
}

连续多次点击按钮后,发现即使函数执行完毕,序列化后的JSON(而非原字典)仍留存在内存中。

疑问

  1. JSONEncoder是否存在已知的内存泄漏问题?
  2. 是否还有其他被忽略的原因导致数据残留?

已知已有开发者反馈相关问题,但未找到明确解决方案。

安全风险

在越狱设备中,恶意钓鱼应用可在用户登出后窃取内存中残留的敏感数据。

问题分析与建议

  • Debug模式的特殊性:Debug环境下系统会保留额外的调试信息(如栈帧、内存快照),局部变量的内存回收时机可能延迟,这些残留数据在Release模式下大概率会被系统立即回收或覆盖,建议先验证Release模式下的内存状态。
  • Data对象的生命周期:JSONEncoder.encode生成的Data是局部变量,但Debug模式下ARC的回收逻辑可能被调试工具干扰;此外若Alamofire开启了请求日志、缓存等功能,可能会对该Data产生额外引用,导致数据残留,需检查Alamofire的配置项,关闭不必要的日志和缓存。
  • 主动清除敏感数据:不能依赖ARC自动回收来清除敏感数据,需主动清空Data内容,例如:
    do {
        let data = try encoder.encode(dic)
        // 主动清空Data内容
        data.resetBytes(in: 0..<data.count)
        dic = [:]
    } catch {
        
    }
    
  • 字典清空的局限性:代码中dic = [:]仅清空了字典变量的引用,但编码器已将字典内容复制到Data中,因此该操作无法影响已生成的JSON数据。

总结

  1. 优先确认Release模式下是否存在相同问题,Debug模式的内存残留不一定会在生产环境复现。
  2. 对包含敏感数据的Data对象进行主动清零操作,避免数据留在内存中。
  3. 检查Alamofire的配置,排除第三方库对敏感数据的额外保留逻辑。

内容的提问来源于stack exchange,提问作者vigdora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:22:49