繁体   English   中英

如果CFDictionaryRef不存在则崩溃

[英]crash if CFDictionaryRef does not exist

从计算机断开以太网电缆或关闭以太网时出现问题。 在这种情况下,一些entrys不存在,我的应用程序将崩溃。 所以我试图找出如何防止和刚刚找到CFDictionaryContainsKey ,但这并不能防止错误。 ? 任何知道解决方法的人

- (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”不存在,应用程序崩溃:(

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

正如SCDynamicStoreCopyValue()的文档所述:

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

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

要解决此问题,只需在调用CFDictionaryContainsKey()之前添加NULL检查。

NSString *interfaceString;
if(dr != NULL && CFDictionaryContainsKey(dr, CFSTR("PrimaryInterface")))
{
  CFStringRef interface = CFDictionaryGetValue(dr, CFSTR("PrimaryInterface"));
  ...
  CFRelease(dr);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM