나는 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에서와, 그래서 내가 적절한 용어를 사용하고 있는지 확실하지 않습니다)이 경우
+1 나는'CFGetTypeID()'를 제안하려고했다. –
예. CF 세계에서 이것이 올바른 해결책입니다. (non-CF Objective-C 객체에 메시지를 보내야한다면'CFGetTypeID'는 도움이되지 않습니다. 왜냐하면 대부분의 Objective-C 클래스에는 대응하는'CFTypeID'가 없기 때문입니다. 브릿지를'id'로 캐스트 한 다음'respondsToSelector :'를 수행하십시오.) –
고마워요! 그것은 완벽하게 작동합니다. – ArtOfWarfare