如何发布这个?

时间:2010-09-23 09:08:35

标签: iphone core-graphics

我正在创建一个位图上下文,在我的代码中有这样的:

bitmapData = malloc(bitmapByteCount);

context = CGBitmapContextCreate (bitmapData,
                                     pixelsWidth,
                                     pixelsHeight,
                                     8,      // bits per component
                                     bitmapBytesPerRow,
                                     colorSpace,
                                     kCGImageAlphaPremultipliedFirst);

在方法返回CGContextRef对象之前,我想我必须释放bitmapData。我可以在退回free(bitmapData)之前安全地致电context吗?

2 个答案:

答案 0 :(得分:3)

CGBitmapContextCreate的文档说明了这一点:

  

在iOS 4.0及更高版本和Mac OS X中   v10.6及更高版本,如果可以传递NULL   你希望Quartz为其分配内存   位图。这让你从中解脱出来   管理自己的记忆,哪个   减少内存泄漏问题。

我建议您传递NULL而不是malloc指针,您将无需担心其内存。

但是,请注意CGBitmapContextCreate名称中包含'create',因此按照惯例,您将拥有返回的对象。您需要在CFRelease()

的某个时刻发布此内容

答案 1 :(得分:1)

如果您正在为iOS 4.0或更高版本开发,Jasarien的答案是最好的。如果您想支持旧版本,请继续阅读。

只要使用上下文,就必须保持bitmapData。如果你试图绘制到位图上下文并且你已经释放了bitmapData,那么就会发生糟糕的事情。最好的解决方案是在上下文中调用CFRelease后释放bitmapData。如果您调用CGBitmapContextCreateImage从位图上下文中提取CGImage,那么请不要担心......当您释放位图上下文时,CGImage将自己创建位图数据。

这意味着制作一个创建并返回位图上下文的方法或函数可能不是最好的主意。如果可以的话,最好在方法的顶部创建上下文,在该methpd中使用它,然后释放上下文并在方法的末尾释放位图。如果您不能这样做,请考虑将上下文及其位图数据存储在ivars中。如果一次需要多个位图上下文,则可能需要创建一个对象来跟踪上下文及其bitmapContext。

这就是为什么如果你只支持iOS 4.0或更高版本,最好为bitmapData传递NULL。如果您使用4.0+并传递NULL,则可以放心地忽略我上面所说的内容,并确保调用者最终在您返回的上下文中调用CFRelease。