【问题标题】:HanekeSwift unable to allocate memoryHanekeSwift 无法分配内存
【发布时间】:2015-07-29 15:02:19
【问题描述】:

我正在获取大约 136 张图像,每张大约 500 KB,以便将它们缓存在磁盘上。

下载图像 #98 后,我开始收到关于剩余图像的以下错误(这让我认为它们没有被缓存)。

2015-07-29 09:52:44.471 MyProject[299:3418965] [HANEKE][ERROR] Failed to get data for key https://s3.amazonaws.com/my_bucket/my_image_n_99.jpg
Jul 29 09:52:45 my.host.net MyProject[299] <Error>: CGBitmapContextInfoCreate: unable to allocate 31492608 bytes for bitmap data
MyProject(299,0xb039f000) malloc: *** mach_vm_map(size=31494144) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

我的第一个猜测是内存缓存已满,所以我调用了 HanekeSwiftCache.onMemoryWarning()(必须改成public),因为它具有以下实现:

for (_, (_, memoryCache, _)) in self.formats {
    memoryCache.removeAllObjects()
}

但即使我调用了它(据说它应该清除内存缓存),我仍然得到错误,所以我不知道出了什么问题。

有什么想法吗?

【问题讨论】:

    标签: swift caching haneke


    【解决方案1】:

    我也遇到了同样的问题,和你一样,将Cache.onMemoryWarning() public设为公开,然后在方法中调用Shared.imageCache.onMemoryWarning() didRecieveMemoryWarning().

    它奏效了!

    【讨论】:

      【解决方案2】:

      对我来说,以前的答案确实有所改善,但并没有完全解决我的内存不足问题。我什至可以让应用程序在没有时间向控制台打印内存警告通知的情况下崩溃。

      我的应用中有两个 Haneke 缓存。 UIImage 缓存和数据缓存。当他们两个同时获取大量数据时,他们似乎无法控制内存。

      我删除了我的 UIImage 缓存并只使用了我的通用数据缓存。提取处理图像网址并需要 UIImage 的任何地方,我将数据强制转换为 UIImage let image = UIImage(data: data)!,我的其余代码像以前一样工作。

      到目前为止,在处理同时加载数百个图像和视频文件时,这对我来说似乎要稳定得多。

      花哨的内置图像助手需要 UIImage 缓存。您可以通过自己扩展 UIImage 来获得相同的旧行为,从 Haneke 复制帮助程序的代码,挂钩到您的数据缓存并执行需要的强制。

      【讨论】:

      • 我再做一个技巧...我有第二个仅磁盘缓存实现,它从网络下载但不将任何内容放入内存。这应该与这个问题是正交的,但确实提高了相当多的感知性能。
      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 2017-07-15
      • 2015-08-15
      • 2015-04-01
      • 2017-12-05
      • 2016-06-03
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多