我在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,它是这样的:
但是当我点击两行时
它告诉我错误在这里,这个代码块的结尾
我的问题是:
1,为什么它会因“ - [CFString release]:消息发送到解除分配的实例0x17065170而崩溃”错误?在CoreFoundation中,创建和发布功能应该配对,不是吗?
2,为什么编译器认为错误在最后一行?首先,不是ABAddressBookRef,而不是CFString,并且控制台日志是明确的: - [CFString release]:消息发送到解除分配的实例,其次,应用程序在我在前一个for循环中注释了CFRelease之后立即执行,所以我认为如果有错误,则不能以任何方式使用CFRelease(addressBook)。
3,这个错误是什么意思?这是一个EXC_ARM_BREAKPOINT,但我们看到很多“消息发送到解除分配的实例”错误标有EXC_BAD_ACCESS。
希望有人可以帮助我。提前谢谢!
答案 0 :(得分:0)
无论如何,您无需创建CFString
对象,因为您可以在NSString
和CFStringRef
之间架起桥梁:
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);
}
}