1

我有一个CFArrayRefwhich most have CFDictionaryRef,但有时它会包含其他东西。如果可以的话,我想从数组中的字典中访问一个值,如果我不能,就不要崩溃。这是代码:

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,所以我不确定我是否使用了正确的术语。)

4

1 回答 1

7

在这种情况下,因为看起来您正在遍历 I/O 注册表,您可以使用CFGetTypeId()

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

如果您确实需要NSObject从您的 C 代码向 的接口发送消息,您可以(请参阅#include <objc/objc.h>和朋友,或在 .m 文件中调用 C 辅助函数),但这些策略并不像CFGetTypeID(),还有更多容易出错。

于 2013-12-08T18:04:44.407 回答