UIButton setBackgroundImage消耗大量内存

时间:2010-03-01 12:02:27

标签: iphone objective-c uibutton memory-management

我正在使用以下代码:

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值。

2 个答案:

答案 0 :(得分:1)

对于评论最后一行导致更少的内存消耗,我并不感到惊讶。当您将该图像设置为按钮的背景时,图像很可能由按钮保留,因此图像保留在内存中。如果不将图像应用为按钮背景,则UIImage的保留计数为0,因此必要时系统可以回收其内存。

Kristopher关于imageWithData和imageNamed之间差异的理论也是正确。查看UIImage文档中每个初始化程序的讨论部分。

答案 1 :(得分:0)

我不确定,但我猜你的问题是imageWithData:每次都会创建一个全新的图像,而imageNamed:方法会一遍又一遍地返回相同的图像。

您可能需要添加一些代码来缓存和重用相同的图像。例如,您可以使用URL作为图像字典中的键,并且只为之前未加载的URL创建新图像。