ios - Swift 内存泄漏
问题描述
我需要一些帮助来确定导致这些内存泄漏的原因。我创建了一个简单的程序来调用 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 分析器:代码的静态分析也可以检测内存分配错误。我自己从未使用过这个工具,但很高兴知道它是可能的。
还有 Apple 的Instruments 简介用户指南
推荐阅读
- jboss - 如何使用 Jboss CLI 向现有数据源添加属性
- selenium-webdriver - 无法通过 selenium 找到 Intranet Web UI 的 Web 元素通过 id、name..etc 查找元素一路
- ios - 可设计构建失败:无法附加到 pid:“26000”
- python - 字符串替换未写入文件
- python - 如何纠正 sklearn.naive_bayes 中的 sample_weight?
- typescript - 使用实时数据库时,与使用 firebase 函数在 typescript 中查询 firebase 等效的 .get() 方法是什么?
- javascript - 如何添加指向此动画按钮的链接
- unity3d - 清理现有 Unity 项目并将其迁移到新的一台或另一台 PC
- c++ - 如何使用 Google Speech To Text API 进行实时转录流音频
- java - 如果我动态地将 fileId 传递给查询,Google drive api to get all children 不起作用