UIButton与图像的内存使用

时间:2014-08-29 19:34:11

标签: ios objective-c image memory-management uibutton

我的应用程序提供了带图像图标的按钮滚动列表。我发现即使.png图标文件只有2 kb,它们的未压缩版本大约为150 kb,并且所有按钮的总和使用了太多的设备内存。

最初每个按钮都是在一个对象的实例中创建的,所以代码基本上是这样的:

for (int i=0; i<buttonsCount; i++) {
    UIImage *image = [UIImage imageNamed:@"Icon"];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:image forState:UIControlStateNormal];
}

当我意识到图像使用了多少内存时,我将图像创建移到了对象之外,让所有对象使用相同的图像。所以现在代码基本上是这样的:

UIImage *image = [UIImage imageNamed:@"Icon"];

for (int i=0; i<buttonsCount; i++) {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:image forState:UIControlStateNormal];
}

但是,内存使用情况是一样的。显然,UIButton正在制作自己的图像数据副本。有没有办法在众多按钮之间“共享”图像数据?

当我使用分配工具在Instruments中运行应用程序时,“VM:CG栅格数据”是太大的项目。

我能想到的唯一替代解决方案是在滚动时根据需要加载和卸载按钮,但我担心会损害滚动性能;或者只是缩小图像的像素大小。

1 个答案:

答案 0 :(得分:0)

您可以使用类似于UITableView的方法(或者可以直接使用UITableView)。它只为屏幕上的项目创建视图(单元格),然后在屏幕外移动时回收这些单元格。这意味着这些视图不会一直重新创建,只是在屏幕上移动之前就会使用正确的数据进行更新。