首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >respondsToSelector:相当于CoreFoundation?

respondsToSelector:相当于CoreFoundation?
EN

Stack Overflow用户
提问于 2013-12-08 17:55:00
回答 1查看 178关注 0票数 1

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

代码语言:javascript
复制
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呢?

(我正在处理一些没有详细说明的开源代码,而且它似乎也不是特别可靠。我不确定是数组包含非字典对象的bug,还是包含非字典对象时没有检测到的bug,但在我看来,在这里添加检查不太可能破坏其他代码,然后强迫它只包含其他地方的字典。我不经常使用CoreFoundation,所以我不确定是否使用了合适的术语。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-08 18:04:44

在本例中,由于您正在遍历I/O注册表,所以可以使用CFGetTypeId()

代码语言:javascript
复制
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()那样直接,而且更容易出错。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20456825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档