【问题标题】:Swift Memory LeaksSwift 内存泄漏
【发布时间】:2020-03-19 03:21:22
【问题描述】:

我需要一些帮助来确定导致这些内存泄漏的原因。我创建了一个简单的程序来调用 api 并获取数据。它按预期工作。但是在仪器中我得到内存泄漏。我一直在努力确定导致此内存泄漏的原因,但没有运气。我还尝试在调试内存图中,当我过滤“仅显示泄漏块”时,没有显示任何块。下面是 Instrument 的代码和屏幕截图:

import UIKit

class ViewController: UIViewController {

    struct main_struct {
         var ACCEPT_DATE: String

         init(_ dictionary: [String: Any]) {

             self.ACCEPT_DATE = dictionary["ACCEPT_DATE"] as? String ?? " "

         }
     }

    var main_array = [main_struct]()

    override func viewDidLoad() {
        super.viewDidLoad()
        let Endpoint: String = "http://mylink.com"
        let url = URL(string: Endpoint)
        downloaddatafromurl(url: url!, completionhandler: { [weak self] (data, response: URLResponse, Error) -> Void in

            if Error != nil {
                print("error in API Connect")
            }
            let jsondata = try?  JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String : NSArray]
            let arrayJSON = jsondata?["apidata"]
            for dict in arrayJSON! {
                self!.main_array.append(main_struct(dict as! [String : Any]))
            }

            //print(data)
            print(response)
        })



    }

    func downloaddatafromurl(url: URL, completionhandler: @escaping (Data, URLResponse , Error? ) -> Void) {

        let session = URLSession.shared
        let task = session.dataTask(with: url, completionHandler: {data, response, error -> Void in
            DispatchQueue.global().async {
                completionhandler (data!, response!, error)
            }
        })
        task.resume()
        session.finishTasksAndInvalidate()
    }
}

仪器截图:

【问题讨论】:

  • 点击红色菱形,你会看到究竟是什么泄漏(如果有的话)。有时泄漏是误报(例如,在您的应用启动时)。
  • 截图下方的信息,是我点击红色菱形后得到的信息。我只是扩展了错误树中的所有级别,只是为了显示我在仪器中看到的信息。
  • 如果有什么东西被泄露了,那就是在你的CFNetwork 电话中。即使应用程序完全空闲,您是否真的看到内存逐渐上升?
  • 我正在调用 finishTasksAndInvalidate 以使会话无效,我也有周参考 [weak self] 在关闭......不知道我错过了什么......

标签: ios swift memory-leaks nsurlsession


【解决方案1】:

您可以使用 Instruments 跟踪内存泄漏:请参阅 this tutorial.

如果您熟悉 Valgrind,则可以在基于 iPhone Simulator SDK 构建的 x86 二进制文件上使用它:see how Landon Fuller does it

Another Stackoverflow answer 建议使用 Clang 分析器:代码的静态分析也可以检测内存分配错误。我自己从未使用过这个工具,但很高兴知道它是可能的。

还有苹果的Introduction to Instruments User Guide

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2021-03-19
    • 2017-11-25
    • 2020-08-07
    相关资源
    最近更新 更多