我正在对AddressBook进行一些测试,虽然我可以获得我正在寻找的数据但我很好奇它是如何传递的。特别是CFDictionaryRef。当我将它转换为NSDictionary并登录到控制台时,我只得到一个字符串值,而不是key = value对。如果我尝试记录allKeys我的测试应用程序中断。
这是我正在使用的代码段:
if ([contactName isEqualToString:ownerName]) {
//get reference to their email addresses
ABMultiValueRef contactEmails = ABRecordCopyValue(thisPerson, kABPersonEmailProperty);
//loop
for (NSUInteger e = 0; e < ABMultiValueGetCount(contactEmails); e++){
CFDictionaryRef thisPersonCFEmailDict = ABMultiValueCopyValueAtIndex(contactEmails, e);
NSDictionary* thisPersonEmailDict = (__bridge NSDictionary*)thisPersonCFEmailDict;
NSLog(@"%@", [thisPersonEmailDict allKeys]);
}
}
答案 0 :(得分:1)
您假设ABMultiValueCopyValueAtIndex()
返回CFDictionaryRef
。它没有。它返回适合该多值的任何值,如CFTypeRef
返回值所示。
您可以使用ABMultiValueGetPropertyType()
找出特定多值记录的值类型。如果返回kABDictionaryPropertyType
,那么你知道它是一个字典,但在你的情况下,它可能会返回kABStringPropertyType
。它也可以返回kABInvalidPropertyType
,这可能表示多值包含不同的类型。如果是这样,您需要使用CFGetTypeID()
来确定从ABMultiValueCopyValueAtIndex()
返回的值的类型。
答案 1 :(得分:1)
CFDictionaryRef是NSDictionary的核心基础对应物。因为NSDictionary和CFDictionary是“免费桥接”,所以您可以在代码中用CFDictionary对象替换NSDictionary对象(使用适当的转换)。虽然它们是相应的类型,但CFDictionary和NSDictionary没有相同的接口或实现,有时您可以使用 CFDictionary 来执行 NSDictionary 无法轻松完成的任务。免费桥接,意味着您可以使用与Core Foundation函数调用的参数相同的数据类型或作为Objective-C消息的接收者。