我有一个函数,它需要一些位图数据并从中返回一个UIImage *。它看起来像这样:缓冲区> CGImageRef-> UIImage的正确内存管理模式是什么?
UIImage * makeAnImage()
{
unsigned char * pixels = malloc(...);
// ...
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, pixelBufferSize, NULL);
CGImageRef imageRef = CGImageCreate(..., provider, ...);
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
return [image autorelease];
}
任何人都可以解释到底谁在这里拥有什么内存?我想正确清理,但我不确定如何安全地进行清理。 Docs对这些模糊不清。如果我在这个函数的末尾创建了UIImage,然后使用UIImage,我会崩溃。如果我在创建UIImage之后释放提供程序或imageRef,我没有看到崩溃,但它们显然是将像素全部传递过来的,所以我很担心释放这些中间状态。 (我知道每CF文件,我应该需要调用后者的发布,因为它们来自创建函数,但我可以在使用UIImage之前做到这一点?)大概我可以使用提供程序的dealloc回调来清理像素缓冲区,但还有什么?
谢谢!
谢谢Kenny。这是一个很好的简洁描述;我想我被原始的堆缓冲区的不可预测性所抛弃了一些,但是一如既往地相信规则并且会得到回报。干杯。 – 2010-01-26 07:10:39
只需添加一些说明,核心功能中的关键词就是“创建”和“新建”。如果函数包含这些单词中的任何一个,则必须释放返回的内存。 大多数核心数据类型都是CFType兼容的。这意味着如果它更容易,你可以使用Objective-C保留/释放/ autorelease调用。即[(id)imageRef释放];或CFRelease(imageRef); – 2010-01-26 09:06:24
如果使用CFRelease,请记得检查'imageRef'是否为NULL。 – kennytm 2010-01-26 09:33:31