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

[iOS]使用CFDataRef创建图像源时,图像I/O是否缓存解码图像?,ios,objective-c,image,caching,Ios,Objective C,Image,Caching,我知道我可以使用[UIImage imageNamed:或其他UIImage方法创建UIImage。我使用图像I/O在我的应用程序中创建gif动画。并调整图像的大小,因为它的超级快速 在WWDC 2012会议中,苹果工程师建议我不应该自己缓存图像,因为图像缓存是由系统处理的。从苹果公司,图像I/O提供的功能之一是 有效缓存 所以我决定让映像I/O为我缓存所有映像。中有一个名为kCGImageSourceShouldCache的键 图像源选项字典键,其说明如下 是否应以解码形式缓存图像 我相信如果

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

在WWDC 2012会议中,苹果工程师建议我不应该自己缓存图像,因为图像缓存是由系统处理的。从苹果公司,图像I/O提供的功能之一是

有效缓存

所以我决定让映像I/O为我缓存所有映像。中有一个名为
kCGImageSourceShouldCache
的键
图像源选项字典键
,其说明如下

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

我相信如果我创建了一个带有url的图像源,那么以后创建的图像就会被缓存。但是如果图像源是用
CFDataRef
对象创建的呢?它只是一个指向某些图像数据的指针,不像url那样可以识别唯一的资源。在这种情况下,映像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);

用仪器做了一些实验后,我终于明白了这一点。也就是说,如果启用了缓存选项,则图像解码只发生一次,并且在第一次需要绘制图像时发生。只要我保留图像的引用,图像的解码版本就会被缓存。图像的来源不相关。

是的,有些人发现解码速度慢,甚至会将图像渲染到背景线程上的屏幕外1x1上下文以强制解码。