如何自动释放 CGImageRef?

发布于 2024-11-29 13:35:27 字数 270 浏览 2 评论 0原文

我有一个返回 CGImageRef 对象的方法。它包含这个调用:

CGImageRef posterFrame = [avAssetImage copyCGImageAtTime:time actualTime:nil error:&error];
...
return posterFrame;

据我了解,这种情况需要自动释放。但我不知道该怎么做。我尝试过使用 CFCollectable(),但它不起作用。有什么想法吗?

I have a method that returns a CGImageRef object. It contains this call:

CGImageRef posterFrame = [avAssetImage copyCGImageAtTime:time actualTime:nil error:&error];
...
return posterFrame;

This situation, as I understand it, calls for an autorelease. But I have no idea how to do it. I've tried using CFCollectable(), but it doesn't work. Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情归归情 2024-12-06 13:35:27

如果您使用垃圾回收,请使用 CFMakeCollectable(posterFrame)。如果您使用传统的内存管理,则非常简单:

return (CGImageRef)[(id)posterFrame autorelease];

CFTypeRef (在本例中为 CGImageRef)转换为 Objective-C 对象指针,将其发送给-autorelease 消息,然后将结果转换回 CGImageRef。此模式适用于(几乎)任何与 CFRetain()CFRelease() 兼容的类型。

If you're using garbage collection, use CFMakeCollectable(posterFrame). If you're using traditional memory management, it's very straightforward:

return (CGImageRef)[(id)posterFrame autorelease];

You cast the CFTypeRef (in this case, a CGImageRef) to an Objective-C object pointer, send it the -autorelease message, and then cast the result back to CGImageRef. This pattern works for (almost) any type that's compatible with CFRetain() and CFRelease().

月牙弯弯 2024-12-06 13:35:27

Core Graphics(和 Core Foundation)没有 自动释放池,因此如果您想返回您的 CGImageRef 您需要将您的函数命名为包含 Create(fe MyCreatePosterImage()) 或返回 UIImage 对象:

CGImageRef posterFrame = [avAssetImage copyCGImageAtTime:time actualTime:nil error:&error];
UIImage *result = [UIImage imageWithCGImage:posterFrame];
CGImageRelease(posterFrame);
return result;

Core Graphics (and Core Foundation) doesn't have an autorelease pool, so if you want to return your CGImageRef you need to either name your function containing Create(f.e. MyCreatePosterImage()) or return UIImage object instead:

CGImageRef posterFrame = [avAssetImage copyCGImageAtTime:time actualTime:nil error:&error];
UIImage *result = [UIImage imageWithCGImage:posterFrame];
CGImageRelease(posterFrame);
return result;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文