我的代码如下:
CGImageRef ImageCreateWithFile(NSString *filePath)
{
if(NULL == filePath)
return NULL;
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
if(NULL == data)
return NULL;
CGImageSourceRef isrc = CGImageSourceCreateWithData((CFDataRef)data, NULL);
// [data release];
CGImageRef image = CGImageSourceCreateImageAtIndex(isrc, 0, NULL);
CFRelease(isrc);
isrc = nil;
[data release];
data = nil;
return image;
}
- (IBAction)addClick:(id)sender
{
CGImageRef image = ImageCreateWithFile(@"/Users/user/t.jpg");
if(NULL != image)
_imageList.push_back(image);
}
- (IBAction)removeClick:(id)sender
{
if(_imageList.size() > 0)
{
CGImageRef image = _imageList[0];
CGImageRelease(image);
image = nil;
_imageList.erase(_imageList.begin());
}
}imageList声明如下:
std::vector<CGImageRef> _imageList;本程序是为测试释放CGImageRef的方法而编写的。当我添加一些图像时,我在活动监视器中看到程序的内存使用率有规律地上升,但在我通过remove方法删除一个或多个图像后,内存从未下降。我不知道为什么release方法不起作用?有什么帮助吗?谢谢!
发布于 2011-11-13 20:24:43
如果您查看CGImageSourceCreateImageAtIndex的文档,您将看到最后一个参数是一个选项字典。
其中一个选项称为kCGImageSourceShouldCache。
您可以尝试传递一个字典,将此选项设置为false。下面的代码片段来自映像I/O指南here
CFStringRef myKeys[1];
CFTypeRef myValues[1];
CFDictionaryRef myOptions;
myKeys[0] = kCGImageSourceShouldCache;
myValues[0] = (CFTypeRef)kCFBooleanFalse;
myOptions = CFDictionaryCreate(NULL, (const void **) myKeys,
(const void **) myValues, 1,
&kCFTypeDictionaryKeyCallBacks,
& kCFTypeDictionaryValueCallBacks);
CGImageRef image = CGImageSourceCreateImageAtIndex(isrc, 0, myOptions);https://stackoverflow.com/questions/7554319
复制相似问题