2011-09-27 4 views
3

복사되지 않은 키가있는 사전에 대한 요구 사항이 있습니다. 이것은 명랑한 춤을 추며 CFMutableDictionary의 문을 닫았습니다.NSMutableDictionary 대 CFMutableDictionary

나는 서로 교환 할 수있는 범위를 이해하려고 노력하고 있습니다. CFMutableDictionary 애플의 문서에서 그들은 상태 :

당신이 NSMutableDictionary * 매개 변수를 참조하는 방법에

, 당신이 CFMutableDictionaryRef 매개 변수를 참조 CFMutableDictionaryRef에서 패스, 그리고 함수에서, 당신은에 전달할 수 있습니다 NSMutableDictionary 인스턴스

는하지만 NSMutableDictionary에 CFMutableDictionary 캐스팅과에 NSMutableDictionary의 메소드를 호출 할 수있을 것인지 궁금, 그것은 당신이 할 수있는 경우에 보인다;

CFDictionaryCreateMutable()을 사용하여 CFMutableDictionary를 만들고 NSMutableDictionary로 캐스팅합니다. 나는 또한 호출 할 수 있습니다

[cfDictionaryCastToNSDictionary objectForKey:someKey] 

을 :

나는 호출 할 수 있습니다

[cfDictionaryCastToNSDictionary setObject:someObject forKey:someKey] 

... 키를 복사하거나 NSCopying 구현하지 않을 경우 예외를 발생 것이다. for 루프를 사용하여 값을 반복 할 수도 있습니다.

나는 전화 그러나 경우 :

[cfDictionaryCastToNSDictionary count] 

나는 예외를 얻을.

내 질문에 정확히 무슨 일이 일어나고 있습니까? 어떤 시점에서 애플 문서는 NSDictionary로 캐스팅하여 CFMutableDictionary에 존재하지 않는 몇 가지 메소드를 호출 할 수 있다고 언급합니다.

+0

데스크톱 코코아를 타겟팅하는 경우 'NSPointerArray'를 확인하십시오. –

+0

어떤 예외가 있습니까? 'count '를 호출하면 정상적으로 작동합니다. – DarkDust

+0

불행히도 저는 모바일을 목표로 삼고 있습니다. 나는 NSPointerArray와 같은 것이 없다는 것에 놀랐다. – Undistraction

답변

3

수신자 부담 브리징을 사용하는 문제를 이해하려면 Mike Ash의 "Toll-Free Bridging Internals"으로 시작하여 거기에서부터 시작해야합니다.

그냥 다시 일하고 싶다면 대답은하지 마라. 무료 전화가 아닌 브리징 대신 CFDictionary와 함께 CF 기능을 사용하여 문제를 완전히 피하십시오. CFDictionary API는 사전이 내부적으로 사용되는 경우 수행하려는 작업을 수행하기에 충분해야합니다.

+0

링크를 제공해 주셔서 감사합니다. – Undistraction