2011-09-26 474 views
4

我这样的代码:如何正确释放CGImageRef?

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方法删除一个或多个图像后,内存永远不会下降。我不知道为什么释放方法不起作用?任何帮助?谢谢!!!

+3

从不依靠活动监视器的剖析。改用仪器。 –

回答

2

如果你看看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); 
+0

你是对的! –