繁体   English   中英

从Swift中的IKImageView获取CGImageRef

[英]Get a CGImageRef from an IKImageView in Swift

我正在尝试将图像与视图关联,但Xcode会给我一个错误。 这是代码:

@IBOutlet var imageView: IKImageView // Link to the image view.

func saveImage() {
    var newImage: CGImageRef = imageView.image() // Line with an error.
}

我有一个awakeFromNib函数来设置视图中的图像。 上面的代码返回'Unmanaged<CGImage>' is not convertible to 'CGImageRef'

我知道Swift中的类型是可选的但是我不明白为什么我会得到这个错误, IKImageView类参考清楚地说让IKImageView的图像返回CGImageRef。

这与Objective C API与Swift的桥接有关。 通过将原始Objective C标头转换为Swift版本,已经桥接了Swift版本的API(我认为主要是自动的)。 在许多情况下,转换可以计算出你将要获得什么样的价值,因此在Swift中你可以得到一个你可以按照你的期望使用的“普通”类型。

但是,转换仍在进行中。 在这种情况下,您所看到的是一种用于帮助您手动管理内存的类型,当转换过程不知道您是否要取回为您保留的对象时,因为API没有有它可以用来解决它的传统注释。

Unmanaged类型有效地说“你必须告诉我如何处理所包含的值以使内存管理正确”。 只要获得Unmanaged值,就应该调用其中两种方法之一:

takeUnretainedValue() 
takeRetainedValue()

...取决于你得到的对象是“+0”还是“+1”。 所以,你应该做的事情如下:

var newImage: CGImage = imageView.image().takeUnretainedValue()

一旦你完成了这个(你应该立即做了),你已经给了Swift足够的提示,它现在可以用ARC正确地管理对象,并获得了正确类型的有效引用。

今年WWDC视频“Swift互操作性深度”视频结束时简要介绍了这一点。

查看显示Swift声明的IKImageView引用中image()方法,您将看到它返回一个Unmanaged<CGImage>! 这意味着没有设置ImageKit,以便编译器可以在其API上自动推断CoreFoundation内存管理语义。 (这会影响Swift转换和ObjC隐式ARC桥接。)它应该,因此这是一个很好的文件错误

当编译器无法自动推断其ARC行为时,Swift类型Unmanaged<T>是与CF类型交互的方式。 要获取基础类型,请调用takeUnretainedValue()takeRetainedValue() - 您必须根据您调用的API是否已经保留其返回的值来选择哪个。 令人兴奋的猜测! (同样,消除猜测是一个很好的bug文件 。)你可以在使用Swift with Cocoa和Objective-C时阅读更多相关信息。

无论如何,在这种情况下,您可能期望CGImage在提供时不会增加IKImageView的保留计数,因此您可以像这样展开Unmanaged

var newImage: CGImage = imageView.image().takeUnretainedValue()

另请注意,在Swift中使用CF类型时,不需要Ref后缀。 CGImageRef是CGImage的CGImage 。)Swift允许你使用CF类型,就好像它们是Swift对象(而不是作为不透明C类型的C指针)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM