繁体   English   中英

JSONSerialization.jsonObject导致Swift 4.0和4.2中的内存泄漏

[英]JSONSerialization.jsonObject causes memory leak in swift 4.0 and 4.2

我正在使用Swift 4.0开发iOS应用程序(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。

有没有人遇到这个问题? 有解决方案吗?

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

调试应用程序后,我发现问题出在JSONEncoder中,并且在进行一些Google搜索后,我发现这是一个错误,我发现最有效的解决方案是使用autoreleasepool。 看这里

就我而言:

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)

    }

}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM