首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确发布CGImageRef?

如何正确发布CGImageRef?
EN

Stack Overflow用户
提问于 2011-09-26 19:22:45
回答 1查看 1.2K关注 0票数 4

我的代码如下:

代码语言:javascript
复制
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声明如下:

代码语言:javascript
复制
 std::vector<CGImageRef> _imageList;

本程序是为测试释放CGImageRef的方法而编写的。当我添加一些图像时,我在活动监视器中看到程序的内存使用率有规律地上升,但在我通过remove方法删除一个或多个图像后,内存从未下降。我不知道为什么release方法不起作用?有什么帮助吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2011-11-13 20:24:43

如果您查看CGImageSourceCreateImageAtIndex的文档,您将看到最后一个参数是一个选项字典。

其中一个选项称为kCGImageSourceShouldCache

您可以尝试传递一个字典,将此选项设置为false。下面的代码片段来自映像I/O指南here

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7554319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档