TableView中的UIImage吃内存

时间:2015-02-19 03:00:45

标签: ios xcode swift uiimage tableview

我有tableView有12张图片。每行1个。图像大小为536 x x536 px(对于@ 3x为804 x 804),全部为JPG格式,文件大小约为250kb。当我使用模拟器时,内存仅为tableView达到40MB。是的,我使用了dequeueReusableCellWithIdentifier。这是截图:

enter image description here

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

这里是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:)似乎有点减少了内存使用量。 这是截图:

enter image description here

更新代码:

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)。这是对的吗?

感谢。

2 个答案:

答案 0 :(得分:2)

如果你想在你的手机中想要图像,可以给你一些提示:

  1. 确保要放入单元格中的图像是它们将被绘制到单元格中的空间的确切大小。这意味着图像只有它们需要的大小。这有两个好处:首先,您不会占用磁盘缓存和内存缓存中的空间,而不是您需要的空间。内存部分非常重要,因为这意味着您的应用程序会感觉更加快速,因为它的负载较少。其次,如果图像是需要绘制的确切大小,那么渲染它们不需要昂贵的调整大小代码来运行。
  2. 即使你似乎已经这样做了,我也会把它放在这里为了清晰和后人:从来没有,从tableView:cellForRowAtIndexPath:中加载来自磁盘/网络的图像,在你手上之前总是拥有内存中的所有图像它是你单元格中的UIImageView。如果此刻没有图像,请在不同的线程中发出异步请求以读取磁盘,然后在将图像存入内存后进行设置。如果您非常挑剔并且需要它,那么源于此技术的另一个优化是仅在表视图停止滚动时重绘这些图像。这可以明显地改变事物的外观,但如果你的图像很重,可能不是一件坏事,并且由于某些原因你无法在屏幕上绘制像素到像素。
  3. 在管理内存缓存方面,如果你想避免低内存警告(如果你在应用程序中努力清理时不一定是坏事),你可能想要考虑一下内存缓存中的人工上限。比如说3x适合屏幕的图像数量,以及缓存中的图像是你从哪里开始连续3次(或者取决于你的应用程序)。很抱歉这里含糊不清,但这部分实际上取决于您的应用的使用方式。
  4. 对于您的具体情况,我能想到的最后一件事是刷新内存缓存以查找您选择的表格视图。这样你只能拿着可能会看到的图像。这是否有意义,取决于您的应用程序的使用情况。
  5. 来自HERE的参考。

答案 1 :(得分:0)

只是为了提高绩效。执行以下步骤

  1. 现在在列表视图中的代码图像中获得的内存比平时多。
  2. 必须使用imageWithContentsOfFile:path来获取并在图像视图中显示图像。我相信它会对你有所帮助。
  3. 详情请点击此链接: http://www.jorambarrez.be/blog/2012/04/19/ios-imagenamed-vs-imagewithcontentsoffile/