Swift 3 URLSession 内存泄漏
Swift 3 URLSession memory leak
我在 swift 中对 URLSession.shared
的网络调用中出现内存泄漏 3. 这是错误还是我做错了什么?
override func viewDidLoad() {
super.viewDidLoad()
let urlStr = "https://qrng.anu.edu.au/API/jsonI.php?length=10&type=hex16&size=2"
URLSession.shared.dataTask(with: URL(string: urlStr)!) { data, response, error in
self.view.backgroundColor = UIColor.red
print(response)
}.resume()
}
共享 URL 会话具有用于 cookie 和其他 "browser" 内容的凭据存储。因为它是共享的,所以它是一个将永远存在于您的应用程序中的单例。 Instruments 将此解释为泄漏。
建议:在查找泄漏之前重复此操作几次。
此外,当您的请求仍未决时,您的回调中的自我引用很可能会保留在您的视图控制器上。在块开始时使用 weak self 来打破循环。但这完全取决于您的设计。至少在某些情况下它让我明白了。
我也想参考这个答案:
我在 swift 中对 URLSession.shared
的网络调用中出现内存泄漏 3. 这是错误还是我做错了什么?
override func viewDidLoad() {
super.viewDidLoad()
let urlStr = "https://qrng.anu.edu.au/API/jsonI.php?length=10&type=hex16&size=2"
URLSession.shared.dataTask(with: URL(string: urlStr)!) { data, response, error in
self.view.backgroundColor = UIColor.red
print(response)
}.resume()
}
共享 URL 会话具有用于 cookie 和其他 "browser" 内容的凭据存储。因为它是共享的,所以它是一个将永远存在于您的应用程序中的单例。 Instruments 将此解释为泄漏。
建议:在查找泄漏之前重复此操作几次。
此外,当您的请求仍未决时,您的回调中的自我引用很可能会保留在您的视图控制器上。在块开始时使用 weak self 来打破循环。但这完全取决于您的设计。至少在某些情况下它让我明白了。
我也想参考这个答案: