CFStringCreateWithCString与CFRelease配对,但它崩溃了

时间:2015-07-09 08:05:18

标签: ios objective-c core-foundation

我在for循环中放置了一对CFStringCreateWithCString和CFRelease

    for (NSInteger i = 0; i < tempDict.count; i ++) {
        NSString *key = tempDict.allKeys[i];
        NSString *numStr = tempDict[key];
        CFStringRef numValue = CFStringCreateWithCString(kCFAllocatorDefault, [numStr UTF8String], kCFStringEncodingUTF8);
        if (!ABMultiValueAddValueAndLabel(phone, numValue, kABPersonPhoneMainLabel, NULL)) {
            DLog(@"add multivalue failed. index: %i", i);
        }
        CFRelease(numValue);
    }

CFRelease导致我的应用程序崩溃,并且控制台已记录:

*** -[CFString release]: message sent to deallocated instance 0x14fa4410

如果我注释掉CF发布,它可以正常工作。但崩溃不像EXC_BAD_ACCESS,它是这样的: enter image description here

但是当我点击两行时

enter image description here

它告诉我错误在这里,这个代码块的结尾 enter image description here

我的问题是:

1,为什么它会因“ - [CFString release]:消息发送到解除分配的实例0x17065170而崩溃”错误?在CoreFoundation中,创建和发布功能应该配对,不是吗?

2,为什么编译器认为错误在最后一行?首先,不是ABAddressBookRef,而不是CFString,并且控制台日志是明确的: - [CFString release]:消息发送到解除分配的实例,其次,应用程序在我在前一个for循环中注释了CFRelease之后立即执行,所以我认为如果有错误,则不能以任何方式使用CFRelease(addressBook)。

3,这个错误是什么意思?这是一个EXC_ARM_BREAKPOINT,但我们看到很多“消息发送到解除分配的实例”错误标有EXC_BAD_ACCESS。

希望有人可以帮助我。提前谢谢!

1 个答案:

答案 0 :(得分:0)

无论如何,您无需创建CFString对象,因为您可以在NSStringCFStringRef之间架起桥梁:

for (NSString *key in [tempDict allKeys]) {
        NSString *numStr = tempDict[key];
        if (!ABMultiValueAddValueAndLabel(phone, (__bridge CFStringRef)numStr, kABPersonPhoneMainLabel, NULL)) {
            DLog(@"add multivalue failed. index: %i", i);
        }
}