Dev*_*138 5 memory-leaks ios nsjsonserialization swift
我正在开发一个 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个 Encodable 类的实例,它的属性也属于 Encodable 类,并注意到在instance.toDict()经常调用时,我的应用程序使用的内存增加了很多。即使我不使用返回的结果也是如此,如果我返回 nil 并忽略JSONSerialization.jsonObject.
我确定是这一行导致了问题(忽略结果并返回 nil 仍然会导致问题,注释该行并返回 nil 将停止内存增加。
随着时间的推移,内存越来越大,toDict()被调用的次数也越来越多,我最终在 10 分钟内使用了 400MB。
有没有人遇到过这个问题?有解决办法吗?
也许我可以帮忙。我一直在从事一个具有可编码类模型的项目。我以为一切都工作正常,直到我意识到应用程序在尝试循环编码时由于内存问题(超过 1.2GB)而崩溃。
调试应用程序后,我发现问题出在 JSONEncoder 中,经过一些谷歌搜索后,我发现这是一个错误,我发现最有效的解决方案是使用 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)
}
}
Run Code Online (Sandbox Code Playgroud)
再次调试后,我发现有一些峰值,但内存稳定了。
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |