簡體   English   中英

Swift 內存泄漏

[英]Swift Memory Leaks

我需要一些幫助來確定導致這些內存泄漏的原因。 我創建了一個簡單的程序來調用 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()
    }
}

儀器截圖:

儀器截圖

您可以使用 Instruments 跟蹤內存泄漏:請參閱本教程。

如果您熟悉Valgrind ,則可以在針對 iPhone Simulator SDK 構建的 x86 二進制文件上使用它: 看看 Landon Fuller 是如何做到的

另一個 Stackoverflow 答案建議使用 Clang 分析器:代碼的靜態分析也可能檢測到內存分配錯誤。 我自己從未使用過這個工具,但很高興知道它是可能的。

還有蘋果的Introduction to Instruments User Guide

嘗試這個!

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM