【问题标题】:How to convert unmanaged<CFData> to NSData?如何将非托管<CFData> 转换为 NSData?
【发布时间】:2015-12-21 23:17:43
【问题描述】:

我需要将我的 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;

在斯威夫特中:

var image: UIImage!

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

【问题讨论】:

    标签: swift xcode6


    【解决方案1】:

    如中所述 Working with Cocoa Data Types,您必须使用takeUnretainedValue()takeRetainedValue() 将非托管对象转换为内存托管对象。 你的情况

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

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

    【讨论】:

    • 图片为nil时失败
    • @AlešOskarKocur:感谢您的反馈。在问题中,此代码之前是 ABPersonH​​asImageData() 检查,为了清楚起见,我现在也将其添加到答案中。这解决了你的顾虑吗?
    【解决方案2】:
    if let imgData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatOriginalSize)?.takeUnretainedValue() {
       if let image = UIImage(data: imgData) {
          //Here's your UIImage
       }
    }
    

    【讨论】:

    • 请解释你的答案。
    • 首先我认为我们不需要保留图像数据,其次因为它可能是 nil,我们不需要包含 nil 数据的图像。 Martin R 的回答出现运行时错误,这解决了问题。
    • ABPersonCopyImageDataWithFormat() 在其名称中包含“复制”并返回 (+1) 保留值。你必须调用takeRetainedValue(),否则它会泄漏内存。 – takeRetainedValue() 不保留图像数据,而是告诉 Swift 运行时返回值是 (+1) 保留,以便适当释放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多