iOS:有人可以为我解释CFDictionaryRef吗?

时间:2013-02-06 19:02:48

标签: ios addressbook

我正在对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]);

                    }

                }

2 个答案:

答案 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消息的接收者。