【问题标题】:Memory Usage of UIButton with ImageUIButton 与 Image 的内存使用情况
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      相关资源
      最近更新 更多