Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios TableView存储中的UIImage_Ios_Xcode_Swift_Uiimage_Tableview - Fatal编程技术网

Ios TableView存储中的UIImage

Ios TableView存储中的UIImage,ios,xcode,swift,uiimage,tableview,Ios,Xcode,Swift,Uiimage,Tableview,我有12幅图像的tableView。每行1个。图像大小为536 x x536 px(804 x 804表示@3x),全部为JPG格式,文件大小约为250kb。当我使用模拟器时,仅该tableView的内存就达到了40MB。是的,我使用了dequeueReusableCellWithIdentifier。以下是截图: 这正常吗?或者我如何改进它?因为我使用了UIImage(名为:…),所以它是缓存的。 我还没有尝试使用真正的设备,仍在等待我的信用卡:) 这里是我的cellforrowatinex

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

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

这里是我的
cellforrowatinexpath
代码:

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). 对吗


谢谢。

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

  • 现在,在您的代码中,列表视图中的图像得到了比平常更多的内存
  • 必须使用imageWithContentsOfFile:path才能在图像视图中获取和显示图像。我相信这会对你有很大帮助
  • 有关详细信息,请查看此链接:
    只是为了提高性能。执行以下步骤

  • 现在,在您的代码中,列表视图中的图像得到了比平常更多的内存
  • 必须使用imageWithContentsOfFile:path才能在图像视图中获取和显示图像。我相信这会对你有很大帮助
  • 有关详细信息,请查看此链接:
    只是为了提高性能。执行以下步骤

  • 现在,在您的代码中,列表视图中的图像得到了比平常更多的内存
  • 必须使用imageWithContentsOfFile:path才能在图像视图中获取和显示图像。我相信这会对你有很大帮助
  • 有关详细信息,请查看此链接:
    只是为了提高性能。执行以下步骤

  • 现在,在您的代码中,列表视图中的图像得到了比平常更多的内存
  • 必须使用imageWithContentsOfFile:path才能在图像视图中获取和显示图像。我相信这会对你有很大帮助
  • 有关详细信息,请查看此链接:

    如果您想在手机中显示图像,请提供一些提示:

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

  • 参考。

    如果您想在手机中显示图像,请提供一些提示:

  • 确保要放在单元格中的图像与要绘制到单元格中的空间大小完全相同。这意味着图像只需要它们所需要的大小。这有两个优点:首先,您不会占用磁盘缓存和内存缓存中超出需要的空间。内存中的部分很重要,因为这意味着你的应用程序会感觉更快,看起来加载更少。其次,如果图像的大小与需要绘制的图像的大小完全相同,则渲染它们不需要运行昂贵的调整大小代码
  • 尽管您似乎已经在这样做了,但为了清晰和后代起见,我将把它放在这里:永远不要在tableView:cellForRowAtIndexPath:中从磁盘/web加载图像,在将图像交给单元格中的UIImageView之前,始终将所有图像存储在内存中。如果您目前没有映像,请在不同的线程中发出异步请求以读取磁盘,然后在内存中有映像后设置映像。如果您非常挑剔并且需要它,那么这种技术产生的另一个优化就是只在表视图停止滚动时重新绘制这些图像。这明显地改变了事物的外观,但如果你的图像很重,并且由于某些原因无法在屏幕上逐像素绘制,这可能不是一件坏事
  • 在管理内存缓存方面,如果您希望避免内存不足警告(这