gpt4 book ai didi

iphone - buffer->CGImageRef->UIImage 的正确内存管理模式是什么?

转载 作者:行者123 更新时间:2023-12-03 18:24:26 26 4
gpt4 key购买 nike

我有一个函数,它获取一些位图数据并从中返回一个 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];
}

谁能准确解释一下谁拥有这里的内存吗?我想正确清理,但我不知道如何安全地进行。文件对这些内容模糊不清。如果我在创建 UIImage 后在此函数末尾释放像素,然后使用 UIImage,则会崩溃。如果我在创建 UIImage 后释放提供程序或 imageRef,我不会看到崩溃,但它们显然一直在传递像素,所以我对释放这些中间状态感到不安。

(我知道根据 CF 文档,我应该需要对后者调用释放,因为它们来自 Create 函数,但我可以在使用 UIImage 之前执行此操作吗?)大概我可以使用提供程序的 dealloc 回调来清理像素缓冲区,但还有什么?

谢谢!

最佳答案

这里的经验法则是“-release* 如果不需要它,就释放它”。

因为之后您不再需要 providerimageRef,所以您应该 -release 所有这些,即

UIImage * image =  [[UIImage alloc] initWithCGImage:imageRef];
CGDataProviderRelease(provider);
CGImageRelease(imageRef);
return [image autorelease];

pixel 不由引用计数管理,因此您需要告诉 CG API 在必要时为您释放它们。这样做:

void releasePixels(void *info, const void *data, size_t size) {
free((void*)data);
}
....

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, pixelBufferSize, releasePixels);

顺便说一句,您可以使用+imageWithCGImage:代替[[[* alloc] initWithCGImage:] autorelease]。更好的是,还有 +imageWithData:,因此您无需搞乱 CG 和 malloc 内容。

(*:除非 retainCount 从一开始就已经为零。)

关于iphone - buffer->CGImageRef->UIImage 的正确内存管理模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2137415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com