【发布时间】:2019-06-11 13:46:06
【问题描述】:
我正在开发一个 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。
有人遇到过这个问题吗?有解决办法吗?
【问题讨论】:
-
为什么你会抛出并返回 nil ?删除
do catch。相关stackoverflow.com/a/46597941/2303865 -
@LeoDabus 我也试过了,这只是让调试更容易
-
尝试将您的编码器设为静态对象。
-
@LeoDabus 不幸的是它仍然会发生
-
你用过泄漏仪器吗?
标签: ios swift memory-leaks nsjsonserialization