TableView 中的 UIImage 吃内存 [英] UIImage in TableView eating memory

查看:39
本文介绍了TableView 中的 UIImage 吃内存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有带有 12 张图像的 tableView.每行 1 个.图像大小为 536 x x536 像素(@3x 为 804 x 804),均为 JPG 格式,文件大小约为 250kb.当我使用模拟器时,只有 tableView 的内存达到 40MB.是的,我使用了 dequeueReusableCellWithIdentifier.这是屏幕截图:

i have tableView with 12 images. 1 for each row. The image size is 536 x x536 px (and 804 x 804 for @3x) all in JPG format with about 250kb file size. When i use Simulator, the memory reach 40MB for that tableView only. Yes, i've used dequeueReusableCellWithIdentifier. here is the screenshot :

正常吗?或者我如何改进它?因为我使用 UIImage(named:....) 所以它被缓存了.我还没试过用真机,还在等我的信用卡..:)

is it normal? or how i can improve it? because i use UIImage(named:....) so it's cached. I haven't try to use real device, still waiting for my credit card.. :)

这里是我的 cellForRowAtIndexPath 代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let kolom = tableView.dequeueReusableCellWithIdentifier("portraitkolom", forIndexPath: indexPath) as portraitdetailTableViewCell
        let portrait = portraits[indexPath.row]

        kolom.portraitdetailgambar.image = UIImage(named: portrait.thumbImage)
        kolom.portraitdetailgambar.layer.shadowColor = UIColor(red: 200.0/255.0, green: 200.0/255.0, blue: 200.0/255.0, alpha: 1.0).CGColor
        kolom.portraitdetailgambar.layer.shadowOffset = CGSizeMake(0, 2)
        kolom.portraitdetailgambar.layer.shadowRadius = 0
        kolom.portraitdetailgambar.layer.shadowOpacity = 1.0

        return kolom
    }

更新:

使用 UIImage(contentsOfFile:) 似乎有点减少内存使用.这是屏幕截图:

using UIImage(contentsOfFile:) seems a bit reducing memory usage. here is the screenshot :

更新代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let kolom = tableView.dequeueReusableCellWithIdentifier("portraitkolom", forIndexPath: indexPath) as portraitdetailTableViewCell
        let portrait = portraits[indexPath.row]
        let paths = NSBundle.mainBundle().pathForResource(portrait.thumbImage, ofType: "jpg", inDirectory: "portraitthumb")

        kolom.portraitdetailgambar.image = UIImage(contentsOfFile: paths!)
        kolom.portraitdetailgambar.layer.shadowColor = UIColor(red: 200.0/255.0, green: 200.0/255.0, blue: 200.0/255.0, alpha: 1.0).CGColor
        kolom.portraitdetailgambar.layer.shadowOffset = CGSizeMake(0, 2)
        kolom.portraitdetailgambar.layer.shadowRadius = 0
        kolom.portraitdetailgambar.layer.shadowOpacity = 1.0

        return kolom
    }

但它仍然是 32MB.. 正常吗?它看起来像 UIImage(contentsOfFile:) 没有检测到 @2x 或 @3x 图像(区分大小写?)..所以我将我的图像重命名为 someimage.jpg(以前是 someimage@3x.jpg).对吗?

but it still 32MB.. is it normal? and it look like UIImage(contentsOfFile:) doesn't detect @2x or @3x images (case sensitive?).. so i rename my images to be someimage.jpg (previously someimage@3x.jpg). Is that correct?

谢谢.

推荐答案

如果你想在你的单元格中显示图像,一些提示:

some tips for you if u want image in your cell:

  1. 确保您要放入单元格的图像与它们将被绘制到单元格中的空间大小完全相同.这意味着图像只有它们需要的大小.这有两个优点:首先,您不会在磁盘缓存和内存缓存中占用比您需要的空间更多的空间.内存部分很重要,因为这意味着您的应用程序看起来会感觉更快速,就像它加载的更少一样.其次,如果图像的大小与需要绘制的完全相同,则渲染它们不需要运行昂贵的调整大小代码.
  2. 即使你似乎已经这样做了,为了清楚和后代,我还是把它放在这里:永远不要在 tableView:cellForRowAtIndexPath: 中从磁盘/网络加载图像,在你手之前总是把所有的图像都放在内存中它到你的单元格中的 UIImageView .如果您目前没有图像,请在不同的线程中发出异步请求以读取磁盘,然后在内存中设置图像.如果您非常挑剔并且需要它,则源于此技术的进一步优化是仅在表格视图停止滚动时重绘这些图像.这明显地改变了事物的外观,但如果您的图像很重,并且由于某种原因您无法在屏幕上逐像素绘制,这可能不是一件坏事.
  3. 在管理内存缓存方面,如果您想避免低内存警告(如果您在应用中认真清理,这不一定是件坏事),您可能需要考虑放置一个内存缓存中的人工上限.假设是适合屏幕的图像数量的 3 倍,缓存中的图像是从您所在位置向下(或向上,取决于您的应用程序)的前 3 个连续屏幕.抱歉在这里含糊其辞,但这部分实际上取决于您的应用的使用方式.
  4. 对于您的特定情况,我能想到的最后一件事是刷新您离开的表视图的内存缓存.这样你就只能保存可能被看到的图像.这是否有意义,同样取决于您的应用的使用情况.

参考来自 这里.

这篇关于TableView 中的 UIImage 吃内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆