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;
}