[iOS]使用CFDataRef创建图像源时,Image I / O是否会缓存解码图像?

时间:2014-12-02 17:08:08

标签: ios objective-c image caching

我知道我可以使用[UIImage imageNamed:]或其他UIImage方法创建UIImages。我使用Image I / O在我的应用程序中创建gif动画。并且调整图像大小,因为它超快!

在WWDC 2012会话中:iOS App Performance: Graphics and Animations,Apple工程师建议我不应该自己缓存图像,因为图像缓存是由系统处理的。从Apple的Image I/O Programming Guide开始,Image I / O提供的功能之一是

  

有效缓存

所以我决定让Image I / O为我缓存所有图像。中有一个名为kCGImageSourceShouldCache的密钥 Image Source Option Dictionary Keys,其描述为

  

图像是否应以解码形式缓存。

我相信如果我使用网址创建图像源,则稍后创建的图像会被缓存。但是如果图像源是用CFDataRef对象创建的呢?它只是指向某些图像数据的指针,它不像可以识别唯一资源的URL。在这种情况下,Image I / O是否仍然缓存图像?感谢。

以下是我用来创建图片的代码:

CFDictionaryRef   myOptions = NULL;
CFStringRef       myKeys[2];
CFTypeRef         myValues[2];

myKeys[0] = kCGImageSourceShouldCache;
myValues[0] = (CFTypeRef)kCFBooleanTrue;
myKeys[1] = kCGImageSourceShouldAllowFloat;
myValues[1] = (CFTypeRef)kCFBooleanTrue;

myOptions = CFDictionaryCreate(NULL, (const void **) myKeys,
                               (const void **) myValues, 2,
                               &kCFTypeDictionaryKeyCallBacks,
                               & kCFTypeDictionaryValueCallBacks);

CGImageSourceRef imageSource = CGImageSourceCreateWithData(imageData, myOptions);
CFRelease(myOptions);
CGImageRef myImage = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
CFRelease(imageSource);

1 个答案:

答案 0 :(得分:0)

经过一些仪器实验后,我终于弄明白了。也就是说,如果启用了缓存选项,则图像解码仅发生一次,并且在第一次需要绘制图像时发生。只要我保留图像的参考,就会缓存图像的解码版本。图像来源无关。