我该如何避免泄露这个Core Foundation对象?

3
以下内容泄漏:
CFStringRef labelName = ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row));
    cell.textLabel.text = (NSString *)labelName;
    CFRelease(labelName);

想知道是否有一种方法可以重写它,使其不泄漏而不需要将 ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row) 分配给一个 CFStringRef,然后在2行代码后手动 CFRelease?当然,这并不是什么大问题……我只是好奇。 编辑: CFAutoRelease 是否可行?请看下面我的评论。
2个回答

2
由于复制/获取的语义,您需要释放任何以Copy结尾的API所返回的内容。 ABMultiValueCopyLabelAtIndex 满足此要求,因此很不幸,您需要获取此引用并稍后释放它。

1
CFAutoRelease怎么样?CFStringRef labelName = ABAddressBookCopyLocalizedLabel(CFAutoRelease(ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row)));可行吗? - Meltemi
1
没有 CFAutoRelease;你应该将创建的任何东西的引用暂时存储在本地变量中,并在完成后使用 CFRelease 进行释放。 - rpetrich
2
在iOS7 SDK中,CoreFoundation/CFBase.h中有CFAutorelease。 - thandasoru
@thandasoru 是的,终于。 - rpetrich

0

你可以使用Objective-C进行自动释放(只要你已经有了一个池)。只需先将其转换为id类型即可。例如,[(id)labelName autorelease] 将正常工作,并且是完全合法的(因为CFStringRef与NSString之间是桥接的)。实际上,你可以对任何基于CoreFoundation的类型执行此操作,尽管我不认为苹果公开记录了这一点,所以理论上,这可能会改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接