ABMultiValueCopyValueAtIndex 允许发布两次?

Posted

技术标签:

【中文标题】ABMultiValueCopyValueAtIndex 允许发布两次?【英文标题】:ABMultiValueCopyValueAtIndex allow release twice? 【发布时间】:2011-05-17 11:29:37 【问题描述】:
ABMultiValueRef phones = ABRecordCopyValue(ref, kABPersonPhoneProperty);
if ( phones ) 
    for(int i=0;i<ABMultiValueGetCount(phones);i++) 
        NSString* label=(NSString*)ABMultiValueCopyLabelAtIndex(phones, i);
        CFRelease ((CFTypeRef)label);
        CFRelease ((CFTypeRef)label);
    

CFRelease(phones);

为什么label可以释放两次而没有任何错误?但手机不能。 如果两次不释放 label 是否有内存泄漏?

我已经在 xcode4 模拟器 4.3 中成功运行了上面的代码

【问题讨论】:

试试这个 NSLog ([NSString stringWithFormat:@"Label retainCount : %d", [label retainCount]]);在您执行 CFRelease 并查看调试器中显示的内容之后 标签retainCount 为:2 => 1 => 1 手机retainCount 为:2 => 1 ABAddressBookRef 从 ABAddressBookCreate() 返回 retainCount 是:1. CFArrayRef 从 ABAddressBookCopyArrayOfAllPeople() 返回 retainCount 是:1. ABRecordRef 从 CFArrayGetValueAtIndex() 返回 retainCount 是:2. 有什么想法吗? 【参考方案1】:

为什么这不会崩溃并不重要。你绝对不应该这样做。这个函数与你的约定是它返回一个你必须只释放一次的值。不管它在内部对这个值做了什么(例如缓存),这可能导致它不崩溃是无关紧要的。

【讨论】:

以上是关于ABMultiValueCopyValueAtIndex 允许发布两次?的主要内容,如果未能解决你的问题,请参考以下文章