首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS CGBitmapContextCreate会复制数据吗?

iOS CGBitmapContextCreate会复制数据吗?
EN

Stack Overflow用户
提问于 2012-02-25 21:10:47
回答 2查看 1.7K关注 0票数 0

我写了这段代码:

代码语言:javascript
复制
 bitmapData = calloc(1, bitmapByteCount );
 context = CGBitmapContextCreate (bitmapData,
                                 pixelsWide,
                                 pixelsHigh,
                                 8,
                                 bitmapBytesPerRow,
                                 colorSpace,
                                 kCGImageAlphaOnly);

当我这样做时,CGBitmapContext复制了我的bitmapData,所以在这些行之后,我应该写

代码语言:javascript
复制
free(bitmapData); 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-25 21:35:14

如果你需要bitmapData,不要释放它。如果您不需要它,请将Quartz作为参数传递,Quartz将自行分配内存(iOS 4.0及更高版本)。

data:指向要渲染图形的内存目标的指针。此内存块的大小应至少为(bytesPerRow*height)字节。在Quartz 4.0及更高版本和Mac v10.6及更高版本中,如果希望iOS为位图分配内存,则可以传递NULL。这将使您从管理自己的内存中解脱出来,从而减少内存泄漏问题。

但是Quartz没有复制bitmapData,它在那里进行渲染。在释放context之后,您应该释放该内存。

编辑:在苹果的一个示例projects中,内存被释放,但不是立即释放:

代码语言:javascript
复制
float drawStage3(CGContextRef context, CGRect rect)
{
    // ...
    cachedData = malloc( (((ScaledToWidth * 32) + 7) / 8) * ScaledToHeight);
    // ...
    bitmapContext = CGBitmapContextCreate(cachedData /* data */,
    // ...
    CFRelease(bitmapContext);
    // ...
    // Clean up
    CFRelease(cachedImage);
    free(cachedData);
}
票数 5
EN

Stack Overflow用户

发布于 2012-02-25 21:13:41

编辑:

您的代码正在通过calloc分配一个内存块-您拥有该内存块。所以,你拥有那个内存中的free。CGBitmapContext create只是使用您创建的内存块创建一个上下文(这就是您必须传递它的原因)。当你使用完那块内存时,你应该释放它。

我会先在上下文上执行CFRelease。上下文创建的任何资源都将由CFRelease处理。

Core Foundation Memory Guide中的“创建规则”表示:

核心基础函数的名称表示您何时拥有返回的对象:

名称中嵌入了“Create”的对象创建函数;名称中嵌入了“Copy”的对象复制函数。如果你拥有一个对象,当你使用完它时,你有责任放弃所有权(使用CFRelease)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9444295

复制
相关文章

相似问题

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