2

断开以太网电缆与计算机的连接或刚刚关闭以太网时出现问题。在这种情况下,某些条目不存在,我的应用程序会崩溃。所以我试图找出如何防止并刚刚找到CFDictionaryContainsKey,但这并不能防止错误。有谁知道也低于 osx 10.6的解决方法?

- (NSString *)checkNetworkInterface
{
    SCDynamicStoreRef ds = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("myapp"), NULL, NULL);
    CFDictionaryRef dr = SCDynamicStoreCopyValue(ds, CFSTR("State:/Network/Global/IPv4"));
    Boolean ck = CFDictionaryContainsKey( dr, CFSTR("PrimaryInterface"));
    NSString *interfaceString;
    if (ck) {
        CFStringRef interface = CFDictionaryGetValue(dr, CFSTR("PrimaryInterface"));
        interfaceString = [NSString stringWithString:( NSString *)interface ];
    } else {
        interfaceString = [NSString stringWithString:@"" ];
    }
    CFRelease(dr);
    CFRelease(ds);
    return interfaceString;
}

如果“状态:/网络/全球/IPv4”不存在,应用程序崩溃:(

4

2 回答 2

3

作为SCDynamicStoreCopyValue()状态的文档:

返回值:与指定键关联的值,如果没有找到值或发生错误,则返回 NULL。您必须释放返回的值。

CFDictionaryContainsKey()尝试检查传入的字典;如果它为 NULL,则会因 NULL 指针取消引用而崩溃。您也不应该CFRelease()使用 NULL 指针。

要纠正这个问题,只需在调用之前添加一个 NULL 检查CFDictionaryContainsKey()

NSString *interfaceString;
if(dr != NULL && CFDictionaryContainsKey(dr, CFSTR("PrimaryInterface")))
{
  CFStringRef interface = CFDictionaryGetValue(dr, CFSTR("PrimaryInterface"));
  ...
  CFRelease(dr);
}
于 2013-04-10T17:08:25.830 回答
2

我想你只是想检查是否有dr == NULL,如果有就中止。抱歉,如果这有点明显,但你没有在这里做,它似乎可以避免崩溃。

于 2013-04-10T17:08:13.787 回答