【发布时间】:2014-08-29 19:34:11
【问题描述】:
我的应用会显示带有图像图标的滚动按钮列表。我发现即使 .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 正在制作自己的图像数据副本。有没有办法在许多按钮之间“共享”图像数据?
当我使用 Allocations 工具在 Instruments 中运行应用程序时,“VM: CG raster data”项目变得太大。
我能想到的唯一替代解决方案是在滚动时根据需要加载和卸载按钮,但我担心这会损害滚动性能;或者只是减小图像的像素大小。
【问题讨论】:
标签: ios objective-c image memory-management uibutton