2011-09-26 101 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

你是對的! –