【问题标题】:ABMultiValueCopyValueAtIndex allow release twice?ABMultiValueCopyValueAtIndex 允许发布两次?
【发布时间】: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. 有什么想法吗?

标签: iphone objective-c memory-leaks release addressbook


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2015-11-25
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多