如何将非托管<CFData>转换为NSData?

 孝敏敏__216 发布于 2022-12-28 16:57

我需要将Objective-C转换为Swift以从通讯簿中获取联系人的图像.但是,我得到一个错误与投从CFDataNSData,我不知道如何使这项工作.我该怎么做才能使这项工作正常进行?

在Objective-C中:

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中:

var image: UIImage!

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

Martin R.. 7

如 使用Cocoa数据类型中所述,您必须使用takeUnretainedValue()或将非托管对象转换为内存管理对象takeRetainedValue().在你的情况下

if (ABPersonHasImageData(person)) {
    let imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize).takeRetainedValue()
    let image = UIImage(data: imgData)
}

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

1 个回答
  • 如 使用Cocoa数据类型中所述,您必须使用takeUnretainedValue()或将非托管对象转换为内存管理对象takeRetainedValue().在你的情况下

    if (ABPersonHasImageData(person)) {
        let imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize).takeRetainedValue()
        let image = UIImage(data: imgData)
    }
    

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

    2022-12-28 17:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有