我正在使用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。
有人遇到过这个问题吗?有解决方案吗?
答案 0 :(得分:0)
也许我可以帮忙。我一直在从事具有Codable类模型的项目。我以为一切正常,直到尝试循环编码时才意识到应用程序由于内存问题(超过1.2GB)而崩溃。
调试该应用程序后,我发现问题出在JSONEncoder中,并且在进行一些Google搜索后,我发现该问题是一个bug,我发现效果最好的解决方案是使用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)
}
}
再次调试后,我看到有一些峰值,但是内存稳定了。