0

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

                    }

                }
4

2 回答 2

1

你假设ABMultiValueCopyValueAtIndex()返回一个CFDictionaryRef. 它没有。它返回适合该多值的任何值,如CFTypeRef返回值所示。

您可以使用它ABMultiValueGetPropertyType()来找出特定多值记录具有的值类型。如果返回,kABDictionaryPropertyType那么您知道它是一本字典,但在您的情况下,它可能正在返回kABStringPropertyType. 它也可以返回kABInvalidPropertyType,这可能表明多值包含不同的类型。如果是这样,您将需要使用 usingCFGetTypeID()来识别从ABMultiValueCopyValueAtIndex().

于 2013-02-06T19:10:23.290 回答
1

CFDictionaryRef 是 NSDictionary 的核心基金会对应物。因为 NSDictionary 和 CFDictionary 是“免费桥接的”,所以您可以在代码中用 CFDictionary 对象替换 NSDictionary 对象(使用适当的转换)。虽然它们是对应的类型,但 CFDictionary 和 NSDictionary 没有相同的接口或实现,有时你可以用CFDictionary做一些你不能用NSDictionary轻易做到的事情。免费桥接,意味着您可以使用与 Core Foundation 函数调用的参数或 Objective-C 消息的接收者相同的数据类型。

于 2013-02-06T19:13:55.697 回答