快速内存泄漏

时间:2019-11-23 04:55:35

标签: ios swift memory-leaks nsurlsession

我需要一些帮助来确定造成这些内存泄漏的原因。我创建了一个简单的程序来调用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()
    }
}

仪器截图:

Screenshot from Instrument

2 个答案:

答案 0 :(得分:2)

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

如果您熟悉Valgrind,请在针对iPhone Simulator SDK构建的x86二进制文件上使用它:see how Landon Fuller does it

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

Apple的Introduction to Instruments User Guide

答案 1 :(得分:0)

尝试一下!

更改: DispatchQueue.global().async { completionhandler (data!, response!, error) }

至: DispatchQueue.global().async { [weak self] in guard let self = self else { return } completionhandler (data!, response!, error) }