2017-08-06 39 views
0

我有一个非常简单的iOS应用程序,它从Firebase中提取图像,将它们添加到数组中,然后将它们放入带有url会话的集合视图中。只有一个问题,保存图像集合视图的视图与主视图是分开的视图,因此每次用户点击视图时,都会观察内存使用情况。当你点击后,内存不会改变。每次推送视图时,内存使用量都会不断上升。当我在主视图中执行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

我真的需要你的帮助,以找到一个解决这个问题,因为我不知道怎么了,从未有过这个问题before.Thank你。我希望这个问题有一个简单的解决方案。

+0

运行泄漏仪器查找泄漏的实例。 –

回答

0

我认为你需要,一旦它完成,以避免内存无效会话任务查漏

urlSession.invalidateAndCancel() 
+0

在会话结束后,我尝试了UrlSession.invalidateAndCancel(session),这给了我一个错误 –

+0

什么是错误? –

+0

实例成员'invalidateAndCancel'不能用于'URLSession'类型;你的意思是使用这种类型的值吗? –

1

目前尚不清楚,你内存泄漏。只是因为内存使用量增加并不意味着你有内存泄漏。

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

如果您离开视图控制器并放弃数组,并且您的内存使用量回落,则您没有内存泄漏。

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

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

+0

好吧我从来没有清除阵列一次我关闭视图控制器,我想知道为什么当我关闭视图时不清除内存 –

+0

谁拥有数组?您需要编辑您的问题以显示管理图像数组的代码,并解释您正在使用的视图控制器的生命周期。 –

+0

嘿,我没有更新这个问题 –