Ios 当使用_桥强制转换ABPersonCopyImageDataWithFormat的结果以创建UIImage时,如何防止对象的潜在泄漏?

Ios 当使用_桥强制转换ABPersonCopyImageDataWithFormat的结果以创建UIImage时,如何防止对象的潜在泄漏?,ios,objective-c,memory-leaks,core-foundation,Ios,Objective C,Memory Leaks,Core Foundation,我一直在使用以下代码将地址簿联系人的缩略图图像转换为UIImage。然而,代码给出了一个核心基础警告,一个对象的潜在泄漏: 如何防止潜在泄漏?我的代码有问题:ABPersonCopyImageDataWithFormat返回一个CFDataRef,它不会被释放。这就是潜在的泄漏 核心基础对象不是由ARC自动处理的。从文档中: 编译器不自动管理核心基础对象的生命周期;根据核心基础内存管理规则,您必须调用cFrand和CFRelease(或相应的特定类型的变体)。 作为一个解决方案,我可以按如下方式

我一直在使用以下代码将地址簿联系人的缩略图图像转换为
UIImage
。然而,代码给出了一个核心基础警告,一个对象的潜在泄漏:


如何防止潜在泄漏?

我的代码有问题:
ABPersonCopyImageDataWithFormat
返回一个
CFDataRef
,它不会被释放。这就是潜在的泄漏

核心基础对象不是由ARC自动处理的。从文档中:

编译器不自动管理核心基础对象的生命周期;根据核心基础内存管理规则

,您必须调用cFrand和CFRelease(或相应的特定类型的变体)。 作为一个解决方案,我可以按如下方式分离代码,以便通过调用
CFRelease
来释放
CFDataRef

- (UIImage*)contactPictureForPerson:(ABRecordRef)person
{
    if (person != nil && ABPersonHasImageData(person)) {
        CFDataRef imageDataRef = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail);
        UIImage* image = [UIImage imageWithData:(__bridge NSData*)imageDataRef];
        CFRelease(imageDataRef);
        return image;
    }
    return nil;
}

注意,代码使用桥接来在ObjtoVc和核心基础对象之间进行转换。

普通的
\uuu桥
(如上所述)执行强制转换,而不涉及对象的所有权

作为另一种解决方案,我可以将其切换为使用
\uuuu bridge\uu transfer
——这将执行强制转换并将所有权转移给ARC;ARC将为我处理释放。例如

- (UIImage*)contactPictureForPerson:(ABRecordRef)person
{
    if (person != nil && ABPersonHasImageData(person)) {
        return [UIImage imageWithData:(__bridge_transfer NSData*)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)];
    }
    return nil;
}

如果你使用的是核心基础,那么在这些主题上阅读苹果的文档是值得的。 管理免费桥接包含在本手册中

还有一个问题

- (UIImage*)contactPictureForPerson:(ABRecordRef)person
{
    if (person != nil && ABPersonHasImageData(person)) {
        return [UIImage imageWithData:(__bridge_transfer NSData*)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)];
    }
    return nil;
}