我有一个非常简单的 iOS 应用程序,它从 firebase 中提取图像,将它们添加到数组中,然后将它们放入带有 url session 的 Collection View 中。只有一个问题,保存图像 Collection View 的 View 是与主视图分开的 View ,因此每次用户单击该 View 时,我都会看到内存使用量非常大。当您单击后退时,内存不会更改。每次推送 View 时,内存使用率都在不断上升。我以前在主视图中执行 url session 时从未遇到过这个问题,但现在我在单独的 View 中遇到了问题。这是我下载图片的代码:
用于抓取图像:
let ref = firdatabase.dadatabase.reference
ref.child("Pages").queryOrderedByKey.observeSingleEvent(type: .value, snapshot in
if let pages = snapshot.value as? [String : AnyObject] {
for (_, vale) in pages {
let newPage = page()
If let url = vale["url"] as? String {
newpage.url = url
pagers.append(new page)
}
}
collection view.reloadData()
)}
nsurlsession:
if pagers.count != 0 {
let post = pagers[indexPath.row].url
let url = URL(string: post!)
let session = URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
if let errer = error {
print(errer.localizedDescription)
}
DispatchQueue.main.async {
cell.imageViewPage.image = UIImage(data: data!)
}
})session.resume()
}
return cell
但现在问题来了,内存一直在上升而不是下降。
我真的需要你的帮助来找到这个问题的解决方案,因为我不知道如何解决,而且以前从未遇到过这个问题。谢谢。我希望有一个简单的解决方案来解决这个问题。
最佳答案
不清楚您有内存泄漏。仅仅因为内存使用量增加并不意味着您有内存泄漏。
如果您从远程 URL 加载图像并将它们保存在数组中,那么您的内存使用量将会增加。
如果您离开 View Controller 并丢弃数组,并且您的内存使用量又下降了,那么您就没有内存泄漏。
请注意,您的代码将图像安装到 TableView / Collection View 单元格中,但不会将它们保存在任何地方。这意味着如果用户将一个单元格滚动到屏幕外,然后再滚动回到它,您将再次下载它。
相反,我建议您编写代码以将图像作为文件保存到磁盘。您可以创建文件 URL 的散列并将其用作文件名。检查该文件是否已在磁盘上(可能在您的应用程序的缓存目录中),如果是,则从磁盘加载它。如果没有,请使用 URLSession 下载对象并在下载完成后将文件保存到缓存目录中的哈希文件名,然后将其安装到目标单元中。
关于ios - 从 URL 下载图像时 Nsurlsession 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45534989/