使用URL下载图像时出现Nsurlsession内存泄漏

时间:2017-08-06 17:56:15

标签: ios swift xcode memory memory-leaks

我有一个非常简单的iOS应用程序,它从firebase中提取图像,将它们添加到数组中,然后将它们放入带有url会话的集合视图中。只有一个问题,保存图像集合视图的视图是与主视图分开的视图,因此每次用户点击视图时,我都会看到内存使用情况。单击后退时,内存不会更改。每次按下视图时,内存使用量都会不断增加。在我在主视图中进行url会话之前,我从未遇到过这个问题,但现在我在单独的视图中遇到了问题。这是我下载图像的代码:

抓图片:

      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

现在问题就在这里,内存不断上升而且不会下降。

enter image description here

我真的需要你的帮助来找到这个问题的解决方案,因为我不知道怎么做,以前从未遇到过这个问题。谢谢。我希望有一个解决这个问题的简单方法。

2 个答案:

答案 0 :(得分:1)

内存泄漏并不清楚。仅仅因为内存使用率上升并不意味着你有内存泄漏。

如果您从远程URL加载图像并将其保存在一个数组中,那么您的内存使用量将会增加。

如果您离开视图控制器并丢弃该阵列并且内存使用率下降,则表示您没有内存泄漏。

请注意,您的代码是将图像安装到表视图/集合视图单元格中,但不将它们保存在任何位置。这意味着如果用户在屏幕外滚动一个单元格,然后滚动回到它,您将再次下载它。

相反,我建议您编写代码以将图像作为文件保存到磁盘。您可以创建文件URL的哈希值并将其用作文件名。检查文件是否已在磁盘上(可能在您的应用程序的缓存目录中)并从磁盘加载(如果是这样)。如果没有,请使用URLSession下载对象,并在下载完成后将文件保存到缓存目录中的哈希文件名,然后将其安装在目标单元格中​​。

答案 1 :(得分:0)

我认为一旦完成以避免内存泄漏,您需要使会话任务无效

android:name="com.google.android.geo.API_KEY"