我正在使用以下代码:
UIImage *buttonImage;
if (p.placeImage != nil) {
buttonImage = [UIImage imageWithData:p.placeImage];
} else {
buttonImage = [UIImage imageNamed:@"bg_place_noimg.png"];
}
[imageButton setBackgroundImage:buttonImage forState:UIControlStateNormal];
使用Instruments执行应用程序时,我可以看到setBackgroundImage消耗大量内存。但是,如果我评论最后一行,它就不会发生。任何可能的原因?
编辑:
如果p.placeImage == nil和imageNamed:@“bg_place_noimg.png”用于内存使用是正常的。 p.placeImage是我在Core Data中用来存储从Internet下载的NSData图像的Transformable值。
答案 0 :(得分:1)
对于评论最后一行导致更少的内存消耗,我并不感到惊讶。当您将该图像设置为按钮的背景时,图像很可能由按钮保留,因此图像保留在内存中。如果不将图像应用为按钮背景,则UIImage的保留计数为0,因此必要时系统可以回收其内存。
Kristopher关于imageWithData和imageNamed之间差异的理论也是正确。查看UIImage文档中每个初始化程序的讨论部分。
答案 1 :(得分:0)
我不确定,但我猜你的问题是imageWithData:
每次都会创建一个全新的图像,而imageNamed:
方法会一遍又一遍地返回相同的图像。
您可能需要添加一些代码来缓存和重用相同的图像。例如,您可以使用URL作为图像字典中的键,并且只为之前未加载的URL创建新图像。