我怎样才能知道 UIImageView 使用了多少内存?

How can I find out how much memory a UIImageView is using?

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

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

UIImageViewOne   10Mb

UIImageViewTwo   8Mb

UIImageViewThree 9Mb

UIImageViewFour  3Mb

这是否可以通过 Instruments 实现,或者是否有更简单的方法来查看此信息?

如果要确定图像将使用的内存量,可以查看 cgImage 属性(其中 returns a 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)。

如您所知,如果您想在仪器中看到这一点,您可以使用分配工具,然后在图表中的特定 运行ge 内拖动,您将看到分配的对象,但不是在该时间段内发布:

您会看到对于所选的 运行ge,最大分配是 ImageIO_PNG_Data 的 19.78 MB(或者如果您使用的是 JPG,您会看到 ImageIO_jpeg_Data).

不幸的是,跟踪这些 ImageIO 分配回到我们的代码比大多数内存分配要复杂一些,因为 iOS 在解压缩期间所做的技巧。但是您可以看到此 ImageIO 分配如何与计算出的像素缓冲区大小相关联。

(有关 Swift 早期版本的演绎,请参阅 revision history。)