ios设备上图像的内存管理性能较差

ios设备上图像的内存管理性能较差,ios,memory-management,uiimageview,uiimage,addsubview,Ios,Memory Management,Uiimageview,Uiimage,Addsubview,我有以下问题: 我有一个主视图对象(继承自UIView),它以4x4布局显示由16个正方形组成的网格(每个正方形都是我创建的继承自UIImageView的类) 这16个方块中的每一个都是160x160,并且包含一个不大于30kb的图像(每个方块的图像不同)。然而,该图像是500x500(因为它在程序的其他地方使用,其全尺寸),因此它在“square”类中通过setFrame方法调整大小为160x160 通过查看应用程序运行时Xcode的内存管理功能,我注意到了以下几点: 当将这些方块添加到主视图

我有以下问题:

我有一个主视图对象(继承自UIView),它以4x4布局显示由16个正方形组成的网格(每个正方形都是我创建的继承自UIImageView的类)

这16个方块中的每一个都是160x160,并且包含一个不大于30kb的图像(每个方块的图像不同)。然而,该图像是500x500(因为它在程序的其他地方使用,其全尺寸),因此它在“square”类中通过setFrame方法调整大小为160x160

通过查看应用程序运行时Xcode的内存管理功能,我注意到了以下几点:

  • 当将这些方块添加到主视图对象时,应用程序的内存使用量将增加1MB。实例化时不会发生这种情况,但只有当[self addSubview:square]在主视图对象上添加它们时才会发生这种情况
  • 如果我对所有的方块使用相同的图像,内存增加是 最小的如果在没有任何图像的情况下初始化方形对象,则 增幅基本为零
  • 同一个应用程序在模拟器中运行时,使用1/6的内存 它在实际设备上运行

  • 这里的要点是:为什么在加载30kb的图像时,每个方块都会占用1MB的内存?有没有办法减少这种情况?我尝试了多种不同的方法来创建图像:
    [UIImage-imageNamed:img]
    [UIImage-imagewithcontents-fromfile:path]
    [UIImage-imageWithData:imgData-scale:scale]
    ,以及不调整帧的大小。

    在较小的
    UIImageView中使用500x500图像时,它仍在将较大的图像加载到内存中。您可以通过调整
    UIImage
    本身的大小(而不仅仅是调整
    UIImageView
    )来解决这个问题,制作一个160x160图像,并在视图中使用该图像。有关调整图像大小的一些代码,请参见,然后可以按如下方式调用这些代码:

    UIImage *smallImage = [image scaleImageToSizeAspectFill:CGSizeMake(160, 160)];
    
    您甚至可能希望保存已调整大小的图像,这样您就不会一直为每次创建较小图像的计算开销而烦恼,例如:

    NSData *data = UIImagePNGRepresentation(smallImage);
    [data writeToFile:path atomically:YES];
    
    然后,您可以在以后的视图调用中加载对应于小图像的PNG文件



    在回答您的问题时,为什么它会占用这么多内存,这是因为虽然图像可能以压缩JPG或PNG的形式存储在持久存储中,但我怀疑在内存中它是以未压缩位图的形式保存的。有许多内部格式,但常见的是32位格式,其中红色、绿色、蓝色和alpha各有8位。不管细节如何,您都可以快速了解500 x 500像素表示(每个像素4字节)如何转换为1 mb内存。但是一张160 x 160的图像应该大约是其大小的十分之一。

    感谢您的快速回答和建议。我最终发现罪魁祸首是初始化UIImageView并告诉它调整大小,现在我在实例化UIImageView之前动态调整它们的大小,使用UIGraphicsBeginImageContext,调整大小,从当前上下文设置新图像,然后使用UIGraphicsSendImageContext。这本身就从1MB/图像减少到150k/图像,或多或少。我会给你一个尝试,看看我是否可以得到更低的内存使用率。再一次,非常感谢。这正是我所建议的,即尺寸图像优先。听起来这是你自己想出来的。做得好!!!