2013-02-06 58 views
0

我在AddressBook上做了一些測試,儘管我可以獲取我正在尋找的數據,但我很好奇它是如何傳遞的。特別是CFDictionaryRef。當我將其轉換爲NSDictionary並記錄到控制檯時,我只是得到一個字符串值,而不是一個key = value對。如果我嘗試記錄所有密鑰,則我的測試應用會中斷。iOS:有人可以爲我解釋CFDictionaryRef嗎?

下面是我使用的代碼片段:

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]); 

        } 

       } 
+1

是什麼讓你覺得'ABMultiValueCopyValueAtIndex()'返回一個'CFDictionaryRef'?它被記錄爲返回'CFTypeRef',它是'id'的CoreFoundation等價物。 –

+0

什麼都沒有,我正處於學習曲線階段,只看到我能做什麼。我正在研究這個主題的一些帖子,並拉動一些片段,看看有什麼工作。感謝你的回答,這清除了我的困惑。 – PruitIgoe

回答

1

你假設ABMultiValueCopyValueAtIndex()返回CFDictionaryRef。它沒有。它返回適合該多值的任何值,如CFTypeRef返回值所證明。

您可以使用ABMultiValueGetPropertyType()找出特定多值記錄具有的值類型。如果這返回kABDictionaryPropertyType那麼你知道這是一本字典,但在你的情況下,它可能會返回kABStringPropertyType。它也可能返回kABInvalidPropertyType,這可能表明多值包含不同的類型。如果是這樣,您需要求助於使用CFGetTypeID()來確定從ABMultiValueCopyValueAtIndex()返回的值的類型。

+0

謝謝,這個答案使得事情比上面的評論更清晰。 – PruitIgoe

1

CFDictionaryRef是NSDictionary的核心基礎對象。因爲NSDictionary和CFDictionary是「免費橋接的」,所以你可以在你的代碼中用一個CFDictionary對象替換NSDictionary對象(通過適當的轉換)。雖然它們是相應的類型,但CFDictionary和NSDictionary不具有相同的接口或實現,並且有時您可以使用CFDictionary來處理您無法輕鬆執行的操作。免費橋接意味着您可以使用與Core Foundation函數調用相同的數據類型或作爲Objective-C消息的接收方。