【问题标题】:UIImage in TableView eating memoryTableView中的UIImage吃内存
【发布时间】:2015-02-19 03:00:44
【问题描述】:

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

正常吗?或者我该如何改进它?因为我使用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:) 似乎会减少内存使用量。 这是截图:

更新代码:

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

谢谢。

【问题讨论】:

  • 您的图像是存储在您的应用程序中还是从网络上检索的?请附上您如何获取图像的代码并将它们放入您的 UITableViewCell。
  • 所有图片都捆绑在应用中。
  • @jeraldo :添加了代码。谢谢。

标签: ios xcode swift uiimage tableview


【解决方案1】:

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

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

来自HERE的引用。

【讨论】:

    【解决方案2】:

    只是为了提高性能。执行以下步骤

    1. 现在,列表视图中的代码图像比平时占用更多内存。
    2. 必须使用 imageWithContentsOfFile:path 在图像视图中获取和显示图像。我相信它会对您有很大帮助。

    有关详细信息,请查看此链接: http://www.jorambarrez.be/blog/2012/04/19/ios-imagenamed-vs-imagewithcontentsoffile/

    【讨论】:

    • :- 你好。感谢您的链接.. 不知道这个。感谢更新。非常感谢。
    • @Stranger:我是怎么写的?我试着这样写: let paths = NSBundle.mainBundle().pathForResource(portrait.thumbImage, ofType: "jpg") kolom.portraitdetailgambar.image = UIImage(contentsOfFile: paths!) 但它总是返回 nil...抱歉,我是编程的超级新手.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多