【问题标题】:Nsurlsession memory leak when downloading image with from URL从 URL 下载图像时 Nsurlsession 内存泄漏
【发布时间】:2018-01-14 01:20:52
【问题描述】:

我有一个非常简单的 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

现在问题来了,内存一直在上升,而不是在下降。

我真的需要您的帮助才能找到解决此问题的方法,因为我不知道如何解决,而且以前从未遇到过此问题。谢谢。我希望有一个简单的解决方案来解决这个问题。

【问题讨论】:

  • 运行 Leaks 工具以查找泄漏的实例。

标签: ios swift xcode memory memory-leaks


【解决方案1】:

不清楚您内存泄漏。仅仅因为内存使用量增加并不意味着您有内存泄漏。

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

如果您离开视图控制器并丢弃数组并且您的内存使用量回落,则不会发生内存泄漏。

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

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

【讨论】:

  • 好吧,一旦我关闭视图控制器,我就不会清除数组,我想知道为什么当我关闭视图时它不清除内存
  • 谁拥有阵列?您需要编辑您的问题以显示管理图像数组的代码,并解释您正在使用的视图控制器的生命周期。
【解决方案2】:

我认为您需要在会话任务完成后使其无效以避免内存泄漏

urlSession.invalidateAndCancel()

【讨论】:

  • 我尝试在会话之后执行 UrlSession.invalidateAndCancel(session),这给了我一个错误
  • 实例成员 'invalidateAndCancel' 不能用于类型 'URLSession';您的意思是改用这种类型的值吗?
  • 我认为你需要在你的类中定义这样的 var session: URLSession 实例变量,并在整个类中使用相同的变量。
  • 我不能那样做,因为它会改变我的代码设置:imgur.com/a/ARTSm
猜你喜欢
  • 2015-07-18
  • 2015-11-22
  • 1970-01-01
  • 2020-11-09
  • 2016-08-10
  • 2017-01-17
  • 1970-01-01
  • 2014-12-01
  • 2017-01-27
相关资源
最近更新 更多