首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将unmanaged<CFData>转换为NSData?

如何将unmanaged<CFData>转换为NSData?
EN

Stack Overflow用户
提问于 2014-08-12 10:57:17
回答 2查看 5.1K关注 0票数 7

我需要将我的目标-C转换为Swift,以便从通讯簿获得联系人的图像。但是,从CFDataNSData的for强制转换出现了一个错误,我不知道如何做到这一点。我能做些什么才能使这件事正确运作呢?

在目标C中:

代码语言:javascript
复制
ABRecordID contactID = ABRecordGetRecordID(contactRef);
ABAddressBookRef addressBook = ABAddressBookCreate();

ABRecordRef origContactRef = ABAddressBookGetPersonWithRecordID(addressBook, contactID);

if (ABPersonHasImageData(origContactRef)) {
    NSData *imgData = (NSData*)ABPersonCopyImageDataWithFormat(origContactRef, kABPersonImageFormatOriginalSize);
    img = [UIImage imageWithData: imgData]; 

    [imgData release];
}

CFRelease(addressBook);

return img;

在Swift:

代码语言:javascript
复制
var image: UIImage!

if ABPersonHasImageData(person) {
    var imgData = (ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize))
    image = UIImage.imageWithData(imgData) //Here get the error 
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-12 11:15:57

正如在使用Cocoa数据类型中解释的那样,您必须使用takeUnretainedValue()takeRetainedValue()将非托管对象转换为内存托管对象。在你的情况下

代码语言:javascript
复制
if (ABPersonHasImageData(person)) {
    let imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize).takeRetainedValue()
    let image = UIImage(data: imgData)
}

因为ABPersonCopyImageDataWithFormat()返回一个(+1)保留值。

票数 8
EN

Stack Overflow用户

发布于 2015-03-28 00:15:41

代码语言:javascript
复制
if let imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize)?.takeUnretainedValue() {
   if let image = UIImage(data: imgData) {
      //Here's your UIImage
   }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25262542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档