1

나는 CFArrayRef이 대부분 CFDictionaryRef이지만, 때로는 다른 것들을 포함합니다. 할 수 있으면 배열의 사전에서 값에 액세스하고 싶습니다. 그렇지 않으면 오류가 발생하지 않습니다. 코드는 다음과 같습니다.respondsToSelector : CoreFoundation과 동일합니까?

bool result = false; 
CFArrayRef devices = CFArrayCreateCopy(kCFAllocatorDefault, SDMMobileDevice->deviceList); 
if (devices) { 
    for (uint32_t i = 0; i < CFArrayGetCount(devices); i++) { 
     CFDictionaryRef device = CFArrayGetValueAtIndex(devices, i); 
     if (device) { // *** I need to verify this is actually a dictionary or actually responds to the getObjectForKey selector! *** 
      CFNumberRef idNumber = CFDictionaryGetValue(device, CFSTR("DeviceID")); 
      if (idNumber) { 
       uint32_t fetched_id = 0; 
       CFNumberGetValue(idNumber, 0x3, &fetched_id); 
       if (fetched_id == device_id) { 
        result = true; 
        break; 
       } 
      } 
     } 
    } 
    CFRelease(devices); 
} 
return result; 

이렇게 할 수만 있다면 CFDictionary와 같은 장치 만 처리 할 수있는 방법에 대한 제안이 있으십니까?

(특히 잘 설명되어 있지 않은 일부 오픈 소스 코드를 다루고 있는데 특히 안정적이지는 않습니다. 배열에 비 사전 포함 된 버그인지 잘 모르겠습니다. 개체 또는 사전에없는 개체가 포함되어있을 때 발견되지 않는 버그가 있지만 여기에 수표를 추가하면 다른 곳의 코드가 손상되어 다른 곳에 사전이 포함될 가능성이 적습니다. 자주 작업하지 않습니다. . CoreFoundation에서와, 그래서 내가 적절한 용어를 사용하고 있는지 확실하지 않습니다)이 경우

답변

7

, 당신은 I/O 레지스트리를 탐색하는 것 같습니다 있기 때문에, 당신은 CFGetTypeId() 사용할 수 있습니다

CFTypeRef device = CFArrayGetValueAtIndex(devices, i); // <-- use CFTypeRef 
if(CFGetTypeID(device) == CFDictionaryGetTypeID()) { // <-- ensure it's a dictionary 
    ... 
} 

C 코드에서 NSObject의 인터페이스로 메시지를 보내려면 #include <objc/objc.h>과 친구를 참조하거나 .m 파일에서 C 도우미 함수를 호출 할 수 있지만 이러한 전략은 간단하지 않습니다. CFGetTypeID()으로 표시되며 훨씬 오류가 발생하기 쉽습니다.

+0

+1 나는'CFGetTypeID()'를 제안하려고했다. –

+0

예. CF 세계에서 이것이 올바른 해결책입니다. (non-CF Objective-C 객체에 메시지를 보내야한다면'CFGetTypeID'는 도움이되지 않습니다. 왜냐하면 대부분의 Objective-C 클래스에는 대응하는'CFTypeID'가 없기 때문입니다. 브릿지를'id'로 캐스트 한 다음'respondsToSelector :'를 수행하십시오.) –

+0

고마워요! 그것은 완벽하게 작동합니다. – ArtOfWarfare