检查 CFDictionaryRef 中的空值

Check for Null values in CFDictionaryRef

如何检查 CFDictionaryRef 中的空值?

我测试了这段代码以检查空值,但它没有得到任何值。

CFDictionaryRef dict = ABMultiValueCopyValueAtIndex((addresses), i);



NSString * kCountry; 
if (dict != NULL && CFDictionaryContainsKey(dict, CFSTR("kABPersonAddressCountryKey")))
{
    kCountry = CFDictionaryGetValue(dict, CFSTR("kABPersonAddressCountryKey"));
}

不清楚你在问什么或你所说的"it doesn't get any value"是什么意思。

CFDictionary可能包含空值,这与NSDictionary不同。但是,任何 Apple API 都不太可能提供那种字典。在几乎所有情况下,Apple APIs 都会 return 一个 CFType 对象的字典,使用不允许空值的 kCFTypeDictionaryValueCallBacks 回调。特别是,字典将与 NSDictionary 兼容。我认为是这种情况,除非 API 被专门记录到 return 某种其他类型的字典中。

IF 您收到的字典可能有空值,您显示的代码将起作用,如果字典包含空值,则 kCountry 为空关键 "kABPersonAddressCountryKey"。但是,如果字典不包含该键,并且您没有使用 ARC,则 kCountryif 语句之后仍未初始化。

此外,我认为您可能使用了错误的密钥。您正在传递一个内容为 "kABPersonAddressCountryKey" 的字符串对象。但是,kABPersonAddressCountryKey 不是键的内容。它是一个符号常量的标识符,它是一个键。该符号常量的内容可能与其标识符不同。

最后,如果您正在使用可能包含空值的字典,您应该使用 CFDictionaryGetValueIfPresent() 来获取该值(如果它存在)以及 return 一个布尔值来指示它是否存在,一通电话。如果该函数 return 为真并在您提供的地址作为 value 参数的存储中存储了一个空值,则字典包含一个空值。如果它 return 为假,则它不包含密钥。如果它 return 为真并且是一个非空值,那么,这就是它包含的键值。

我最终将 CFDictionaryRef 转换为 NSDictionary,这样我就可以调用 [dictionary objectForKey ... 并正确检查空值。

代码在检查 nil 值而不是 NULL 值时有效。

    if ([diction objectForKey:@"CountryCode"] == nil ||
        [[diction objectForKey:@"CountryCode"] isEqualToString:@""])
    {


    }else{

        kCountry = CFDictionaryGetValue(dict, CFSTR("CountryCode"));

    }