• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - JSONSerialization.jsonObject 导致 swift 4.0 和 4.2 中的内存泄漏

[复制链接]
菜鸟教程小白 发表于 2022-12-11 21:47:20 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在开发一个 iOS 应用,使用 swift 4.0(4.2 有同样的问题)。

我为 Encodable 添加了一个扩展

extension Encodable{

    func toDict() throws -> [String:Any]? {
        let jsonEncoder = JSONEncoder()
        let jsonData = try jsonEncoder.encode(self)
        do{
            return try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any]
        }
        catch{
            return nil
        }
    }
}

我有一个 Encodable 类的实例,它的属性也属于 Encodable 类,并注意到当经常调用 instance.toDict() 时,我的应用程序使用的内存会增加很多。 即使我不使用返回的结果也是如此,如果我返回 nil 并忽略 JSONSerialization.jsonObject 的结果也是如此。

我确定是这一行导致了问题(忽略结果并返回 nil 仍然会导致问题,评论该行并返回 nil 将停止内存增加。

随着时间的推移,内存越来越大,toDict() 被调用的次数越来越多,我最终在 10 分钟内使用了 400MB。

有人遇到过这个问题吗?有解决办法吗?



Best Answer-推荐答案


也许我可以帮忙。我一直在从事一个具有 Codable 类模型的项目。我认为一切正常,直到我意识到应用程序在尝试循环编码时由于内存问题(超过 1.2GB)而崩溃。

调试应用程序后,我发现问题出在 JSONEncoder 中,经过一些谷歌搜索后,我发现这是一个错误,我发现最有效的解决方案是使用 autoreleasepool。 See HERE

就我而言:

static func store<T: Encodable>(_ object: T, to directory: Directory, as fileName: String) throws {

    do{

        try autoreleasepool{

            let url = getURL(for: directory).appendingPathComponent(fileName, isDirectory: false)
            let encoder = JSONEncoder()

            let data = try encoder.encode(object)

            if FileManager.default.fileExists(atPath: url.path) {
                try FileManager.default.removeItem(at: url)
            }
            FileManager.default.createFile(atPath: url.path, contents: data, attributes: nil)

        }

    }
    catch {

        throw(error)

    }

}

再次调试后,我看到有一些峰值,但内存稳定。

关于ios - JSONSerialization.jsonObject 导致 swift 4.0 和 4.2 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54234580/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap