从计算机断开以太网电缆或关闭以太网时出现问题。在这种情况下,一些entrys不存在,我的应用程序将崩溃。 所以我试图找出如何防止和刚刚找到 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”不存在,应用程序崩溃:(
答案 0 :(得分:1)
我认为您只想检查dr == NULL
是否中止,如果是,则中止。抱歉,如果这有点明显,但你不是在这里做,似乎它可以防止崩溃。
答案 1 :(得分:1)
正如SCDynamicStoreCopyValue()
所述的文档:
返回值:与指定键关联的值,如果未找到值或发生错误,则为NULL。您必须释放返回的值。
CFDictionaryContainsKey()
尝试检查传入的字典;如果它为NULL,则使用NULL指针取消引用崩溃。你也不应该CFRelease()
一个空指针。
要解决此问题,只需在调用CFDictionaryContainsKey()
之前添加NULL检查。
NSString *interfaceString;
if(dr != NULL && CFDictionaryContainsKey(dr, CFSTR("PrimaryInterface")))
{
CFStringRef interface = CFDictionaryGetValue(dr, CFSTR("PrimaryInterface"));
...
CFRelease(dr);
}