我的应用在UICollectionView
中显示了一堆图片。我打电话的时候:
[UIImage imageWithContentsOfFile:thumbnailPath];
我的应用程序使用大约60mb的RAM作为我的测试图像集。
但是,当我接着执行以下操作时:
UIImage* image = [UIImage imageWithContentsOfFile:thumbnailPath];
// Pre-render the image to ensure there isn't lag later.
CGSize imageSize = image.size;
UIGraphicsBeginImageContext(imageSize);
[image drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
UIImage* preRenderedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return preRenderedImage;
只有大约15mb的RAM。
在预渲染之前和之后图像比例是1.0,并且大小是相同的,所以我不确定是什么导致内存使用的差异。我也尝试使用UIGraphicsBeginImageContextWithOptions(imageSize, NO, 2.0);
,这对内存使用没有影响。
类似:Why does my UIImage take up so much memory?
更新
以下是图片信息的转储:
----- original -------
CGImageGetHeight: 1024
CGImageGetWidth: 768
CGImageGetColorSpace: <CGColorSpace 0x174222e20> (kCGColorSpaceDeviceRGB)
CGImageGetBitsPerPixel: 32
CGImageGetBitsPerComponent: 8
CGImageGetBytesPerRow: 4096
CGImageGetBitmapInfo: 0x00000005
kCGBitmapAlphaInfoMask = YES
kCGBitmapFloatComponents = NO
kCGBitmapByteOrderMask = 0x00000000
kCGBitmapByteOrderDefault = YES
kCGBitmapByteOrder16Little = NO
kCGBitmapByteOrder32Little = NO
kCGBitmapByteOrder16Big = NO
kCGBitmapByteOrder32Big = NO
----- pre-rendererd -------
CGImageGetHeight: 1024
CGImageGetWidth: 768
CGImageGetColorSpace: <CGColorSpace 0x174222e20> (kCGColorSpaceDeviceRGB)
CGImageGetBitsPerPixel: 32
CGImageGetBitsPerComponent: 8
CGImageGetBytesPerRow: 4096
CGImageGetBitmapInfo: 0x00002002
kCGBitmapAlphaInfoMask = YES
kCGBitmapFloatComponents = NO
kCGBitmapByteOrderMask = 0x00002000
kCGBitmapByteOrderDefault = NO
kCGBitmapByteOrder16Little = NO
kCGBitmapByteOrder32Little = YES
kCGBitmapByteOrder16Big = NO
kCGBitmapByteOrder32Big = NO
请注意字节顺序的差异,这是有道理的,因为png文件是大端(PNG file format endianness?)。字节顺序是否会导致内存使用过多(可能是因为绘制前的转换)?这将是一个惊喜,因为PNG在iOS应用程序中被全部使用。