从 C 函数将 UnsafeRawPointer 转换为 CGImage returns CGImageRef 崩溃 Swift 4

Casting UnsafeRawPointer to CGImage from C function that returns a CGImageRef Crashes Swift 4

我们有一个跨平台图像处理库,有一个调用 returns CGImageRef 作为 UnsafeRawPointer,我需要将其转换为 CGImage。我知道调用的工作原理与在 objective c 中使用它时一样,我可以在返回的数据上使用 (CGImageRef) returnedData 进行投射,然后得到图像。但是,当尝试使用 Swift 4 在我们的 iOS 应用程序中使用它时,我似乎无法在不收到 EXC_BREAKPOINT 错误或 BAD_ACCESS 错误的情况下进行转换。我试过使用 as! CGImagepointer.load(as: CGImage.self) 进行转换,但都给出了相同的结果。难道我做错了什么?有没有更好的方法将图像从 C 代码传回 swift?我应该提到的是,同一个 C 函数将 CGImageRef 作为参数并传递 CGImage 而不会导致任何问题。

我认为这是一个内存管理问题。例如。你得到的 CGImageRef 在你使用它之前被释放。使用“产品”>“方案”> "Edit Scheme" 菜单,select“运行”部分,“诊断”选项卡并启用“僵尸对象”选项。然后 运行 应用程序. 如果在解除分配后使用了某些对象,您将在控制台中收到一条消息。

如果是这样的话,像这样的事情应该可以解决问题:

// pointer is your UnsafeRawPointer for CGImageRef
let cgImage = Unmanaged<CGImage>.fromOpaque(pointer).takeRetainedValue()

更好的是,如果您可以编辑或覆盖相关库的头文件,则可以注释 C 函数,让 Swift 知道如何正确处理指针。