【问题标题】:How can I find out how much memory a UIImageView is using?如何找出 UIImageView 正在使用多少内存?
【发布时间】:2015-03-23 11:55:26
【问题描述】:

我正在制作一个使用大量 UIImageView 的应用,我想找出每个 UIImageView 的大小,以尝试更详细地查看应用的内存使用情况。

我玩过 Instruments,可以看到应用程序分配的内存量,但我想更深入地了解哪些对象使用哪些内存。例如:

UIImageViewOne   10Mb

UIImageViewTwo   8Mb

UIImageViewThree 9Mb

UIImageViewFour  3Mb

这可以通过 Instruments 实现还是有更简单的方法来查看这些信息?

【问题讨论】:

    标签: ios uiimageview instruments


    【解决方案1】:

    如果要确定图像将使用的内存量,可以查看cgImage 属性(返回CGImageRef),然后将其作为参数提供给bytesPerRow 并相乘由图像的height 表示。因此,看起来如下(在 Objective-C 实现中将使用 CGImageGetBytesPerRowCGImageGetHeight):

    guard let cgImage = image.cgImage else { return }
    
    let bytes = cgImage.bytesPerRow * cgImage.height
    

    这会计算图像在未压缩并在应用程序中使用时所使用的像素缓冲区的大小。通常这个总数等于宽度乘以高度的 4 倍(均以像素为单位)。 (对于红色、绿色、蓝色和 alpha 四个通道中的每一个来说,这都是一个字节。)这并不是与图像相关的所有内存,但它占了绝大多数。


    当我在我的 2,880 × 1,800 像素图像上运行上述代码时,它报告它占用了 20,736,000 字节(即 19.78 mb)。

    如您所知,如果您想在工具中看到这一点,您可以使用分配工具,然后在图表中的特定范围内拖动,您将看到在该时间段内分配但未释放的对象:

    您会看到,对于该选定范围,最大分配是 ImageIO_PNG_Data 的 19.78 mb(或者如果您使用 JPG,您会看到 ImageIO_jpeg_Data)。

    不幸的是,与大多数内存分配相比,将这些ImageIO 分配回溯到我们的代码要复杂一些,因为 iOS 在解压缩过程中会使用诡计。但是您可以看到 ImageIO 分配与计算的像素缓冲区大小之间的关系。

    (请参阅 revision history 以获取早期版本的 Swift 的再现。)

    【讨论】:

    • 这很有帮助,最终使用它来 NSLog 大小,然后是 UIImageViews 框架,这样我就可以知道哪个对象有什么大小。
    • 如果UIImageCGImage 属性是NULL,但CIImage 不是?
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2011-05-06
    • 2010-09-08
    • 2010-12-05
    相关资源
    最近更新 更多