如何正确释放CGImageRef?

4

我的代码如下:

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
不要依赖Activity Monitor进行性能分析,而应该使用Instruments。 - Mike Abdullah
1个回答

2
如果您查看CGImageSourceCreateImageAtIndex的文档,您会发现最后一个参数是选项字典。
其中一个选项称为kCGImageSourceShouldCache
您可以尝试传递一个字典,并将此选项设置为false。 下面的代码片段来自图像 I/O 指南
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接