2014-06-19 3 views
3

뷰와 연관된 이미지를 가져 오려고하는데 Xcode에서 오류를 반환합니다. 내가보기에 이미지를 설정하는 awakeFromNib 기능이Swift의 IKImageView에서 CGImageRef 가져 오기

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

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

: 여기에 코드입니다. 위의 코드는 'Unmanaged<CGImage>' is not convertible to 'CGImageRef'을 반환합니다.

스위프트에서 옵션이 선택 사항이지만이 오류가 나타나는 이유를 모르겠다는 것을 알고 있습니다. IKImageView Class Reference은 분명히 IKImageView의 이미지가 CGImageRef를 반환한다고 말합니다.

답변

6

이것은 Objective C API를 Swift로 연결하는 것과 관련이 있습니다. API의 Swift 버전은 원래 Objective C 헤더를 Swift 버전으로 변환하여 (대부분 자동으로, 나는 믿습니다) 연결되었습니다. 많은 경우 변환을 통해 얻을 수있는 가치가 무엇인지 파악할 수 있으므로 Swift에서는 예상대로 사용할 수있는 "정상적인"유형을 얻게됩니다.

그러나 변환 작업은 아직 진행 중입니다. 이 경우 변환 과정에서 보유하고있는 객체를 다시 가져올 지 여부를 알지 못하는 경우 수동으로 메모리를 관리하는 데 사용되는 유형이 표시됩니다. 이는 API가 ' 그것을 파악하는 데 사용할 수있는 기존 주석이 있습니다.

Unmanaged 유형은 "메모리 관리 권한을 얻기 위해 포함 된 값으로 무엇을 할지를 말해줘야한다"고 효과적으로 말합니다. 당신이 돌아가 오브젝트가 "0"또는 "1"인지에 따라 ...

takeUnretainedValue() 
takeRetainedValue() 

: 즉시 당신이 관리되지 않는 가치를 얻을, 당신은 두 가지 방법 중 하나를 호출해야합니다. 그래서, 당신은 같은 것을 할 것으로 예상하고 있습니다 : 바로 당신이 (당신이 거의 즉시해야하는) 것을 해봤로

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

그리고를, 당신이 힌트의 스위프트 충분히 준 것을 지금 할 수있는 적절하게 ARC로 객체를 적절하게 관리하고 올바른 유형의 유효한 참조를 얻었습니다.

올해의 "Swift Interoperability in Depth"WWDC 비디오가 끝날 때 간단히 언급됩니다.

+0

설명과 유용한 WWDC 비디오를 보내 주셔서 감사합니다. 새 라인은 내 응용 프로그램을 충돌시킵니다 (그러나 빌드하기 전에 더 이상 오류가 없습니다). 나는'takeUnretainedValue()'와'takeRetainedValue()'를 시도했다. 버그 리포트를 작성해야한다고 생각하니? –

+0

충돌에 따라 다르며 그 위치는 다릅니다. 새 라인에 있나요 (상대적으로 안전해야합니다), 아니면 newImage를 사용하려고 할 때입니까? 실제로 'image()'호출에서 되돌아 오는 이미지 (즉,'nil ')가 없을 수 있습니까? 디버깅이 좀 더 필요합니다. –

+0

'println (imageView.image(). takeUnretainedValue())'는''을 반환합니다. 문제는'newImage'를 설정할 때 줄에있는 것 같습니다. –

1

image() 메서드를 the new version of the IKImageView reference that shows Swift declarations에서 보면 Unmanaged<CGImage>!을 반환합니다. 이는 ImageKit이 컴파일러가 CoreFoundation 메모리 관리 의미를 API에서 자동으로 유추 할 수 있도록 설정되지 않았 음을 의미합니다. (이는 Swift 변환과 ObjC 암시 적 ARC 브리징에 모두 영향을 미칩니다.) 그러면 해당 값은 a good bug to file이됩니다.

스위프트 유형 Unmanaged<T>은 컴파일러가 자동으로 ARC 동작을 유추 할 수없는 경우 CF 유형과 상호 작용하는 방식입니다. 기본 유형을 얻으려면 takeUnretainedValue() 또는 takeRetainedValue() 중 하나를 호출하십시오. 호출하는 API가 이미 반환하는 값을 보유하고 있는지 여부에 따라 어느 것을 선택해야 하는지를 선택해야합니다. 흥미로운 추측! 다시 한 번, 추측을 제거하면 a good bug to file이됩니다. 자세한 내용은 Using Swift with Cocoa and Objective-C에서 확인할 수 있습니다.

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

또한 당신이하지 마십시오 :

어쨌든,이 경우에 당신은 아마 IKImageView이 그것을 제공 할 때 Unmanaged과 같이 랩을 해제 할 수 있도록이의 CGImage의 수를 유지 증가되지 않는다는 것을 예상 할 수있다 Swift에서 CF 유형으로 작업 할 때는 접미어 Ref이 필요합니다. (CGImageRefCGImage에 대한 유형입니다.) Swift는 CF 유형을 Swift 객체처럼 작업 할 수있게합니다 (불투명 C 유형에 대한 C 포인터 대신).