2010-09-23 34 views
3

我创建一个位图背景下,在我的代码中有这样的:该方法返回的CGContextRef对象如何发布?

bitmapData = malloc(bitmapByteCount); 

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

之前,我想我必须释放位图数据。在返回context之前,我可以安全地拨打free(bitmapData)吗?

回答

3

CGBitmapContextCreate文档说这个:

在iOS系统4.0和更高版本,以及Mac OS X v10.6中 后来,如果 你想石英为 位图分配内存,你可以传递NULL 。这可以让你从管理你自己的内存的 中解放出来,它可以减少内存泄漏问题。

我建议你传递NULL而不是malloc'd指针,你将不会担心它的内存。

然而,当心,CGBitmapContextCreate其名称中有“创造”,所以按照规定,您将自己的对象返回。您需要在CFRelease()的某个时间发布此信息。

+0

难道这不是真的吗?如果方法名称中有“创建”,则必须自动释放它,以便接收方不必担心内存管理。只有在方法名称或“alloc”中为“新”时,您才必须手动释放。至少这是我学到了什么;) – openfrog 2010-09-23 09:36:49

+0

这个问题:http://stackoverflow.com/questions/870243/releasing-core-foundation-object-references解释关于核心基础释放对象的几件事情。 Core Foundation没有autorelease的概念。 – Jasarien 2010-09-23 11:06:39

+0

从这个问题的答案中我链接到:“由于在Core Foundation中没有autorelease等价物,如果你从方法返回一个引用,返回数组而不释放它,你应该(除非你是邪恶的),那么在方法名中包含“create”以向调用者指示他们现在拥有对返回对象的引用。“ – Jasarien 2010-09-23 11:08:41

1

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

你必须保持的位图数据,只要四周,正在使用的上下文。如果尝试绘制位图上下文并释放bitmapData,则会发生“坏事”。在上下文中调用CFRelease后,最好的解决方案是释放bitmapData。如果您调用CGBitmapContextCreateImage从位图上下文中提取CGImage,那么请不要担心......当您释放位图上下文时,CGImage将自行创建位图数据的副本。

这意味着是,使创建并返回一个位图上下文可能不是最棒的想法的方法或功能。如果可以的话,最好在方法的顶部创建上下文,在该方法中使用它,然后释放上下文并在方法结束时释放位图。如果你不能这样做,考虑将上下文和它的bitmapData存储在ivars中。如果您一次需要多个位图上下文,您可能需要创建一个对象来跟踪上下文及其bitmapContext。

这就是为什么它是最好的传递NULL为位图数据,如果你只支持IOS版本4.0或更高版本。如果您使用的是4.0+并且传递了NULL,那么您可以放心地忽略上面所述的内容,并确保调用者最终在返回的上下文中调用CFRelease。