菜鸟教程小白 发表于 2022-12-11 21:47:20

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


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

<p>我为 Encodable 添加了一个扩展 </p>

<pre><code>extension Encodable{

    func toDict() throws -&gt; ? {
      let jsonEncoder = JSONEncoder()
      let jsonData = try jsonEncoder.encode(self)
      do{
            return try JSONSerialization.jsonObject(with: jsonData, options: []) as?
      }
      catch{
            return nil
      }
    }
}
</code></pre>

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

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

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

<p>有人遇到过这个问题吗?有解决办法吗? </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>也许我可以帮忙。我一直在从事一个具有 Codable 类模型的项目。我认为一切正常,直到我意识到应用程序在尝试循环编码时由于内存问题(超过 1.2GB)而崩溃。</p>

<p>调试应用程序后,我发现问题出在 JSONEncoder 中,经过一些谷歌搜索后,我发现这是一个错误,我发现最有效的解决方案是使用 autoreleasepool。 <a href="https://bugs.swift.org/browse/SR-5501?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel" rel="noreferrer noopener nofollow">See HERE</a> </p>

<p>就我而言:</p>

<pre><code>static func store&lt;T: Encodable&gt;(_ 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)

    }

}
</code></pre>

<p>再次调试后,我看到有一些峰值,但内存稳定。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - JSONSerialization.jsonObject 导致 swift 4.0 和 4.2 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/54234580/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/54234580/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - JSONSerialization.jsonObject 导致 swift 4.0 和 4.2 中的内存泄漏