2013-02-06 4 views
0

나는 AddressBook에 대해 몇 가지 테스트를하고 있는데, 내가 원하는 데이터를 얻을 수는 있지만 어떻게 전달되는지 궁금하다. 특히 CFDictionaryRef. 이것을 NSDictionary로 캐스팅하고 콘솔에 로그 할 때 나는 단지 키 = 값 쌍이 아닌 문자열 값을 얻습니다. 모든 키를 기록하려고하면 테스트 앱이 중단됩니다. 당신은 ABMultiValueCopyValueAtIndex()CFDictionaryRef을 반환 가정하고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

:

는 여기에 내가 사용하고 코드 조각입니다. 그렇지 않습니다. 반환 값이 CFTypeRef 인 것처럼 다중 값에 적합한 값을 반환합니다.

ABMultiValueGetPropertyType()을 사용하면 특정 다중 값 레코드에 어떤 값 유형이 있는지 알 수 있습니다. 그 사람이 kABDictionaryPropertyType을 반환하면 그 사람이 사전이라는 것을 알지만, 귀하의 경우에는 아마도 kABStringPropertyType을 반환 할 것입니다. kABInvalidPropertyType을 반환 할 수도 있는데, 이는 다중 값에 다른 유형이 있음을 나타낼 수 있습니다. 그렇다면 ABMultiValueCopyValueAtIndex()에서 반환되는 값의 유형을 확인하려면 CFGetTypeID()을 사용해야합니다.

+0

감사합니다.이 대답은 위의 의견보다 훨씬 명확합니다. – PruitIgoe

1

CFDictionaryRef는 NSDictionary의 핵심 파운데이션입니다. NSDictionary와 CFDictionary는 "수신자 부담 브리지"이기 때문에 적절한 캐스팅을 사용하여 코드의 NSDictionary 객체를 CFDictionary 객체로 대체 할 수 있습니다. CFDictionary와 NSDictionary는 상응하는 유형이지만 인터페이스 나 구현이 동일하지 않으며 의 경우 CFDictionary을 사용하면 쉽게 NSDictionary으로 처리 할 수 ​​없습니다. 수신자 부담 브리징은 Core Foundation 함수 호출에 대한 매개 변수와 동일한 데이터 유형을 사용하거나 Objective-C 메시지의 수신자로 사용할 수 있음을 의미합니다.

관련 문제