检查CFDictionaryRef中的Null值

时间:2015-01-03 20:50:52

标签: objective-c

如何在CFDictionaryRef中检查空值?

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

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



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

2 个答案:

答案 0 :(得分:1)

目前尚不清楚你在问什么,或者你的意思是“它没有任何价值”。

CFDictionary可能包含空值,这与NSDictionary不同。但是,任何Apple API都提供这种类型的字典是相当不可能的。几乎在所有情况下,Apple API都会返回CFType个对象的字典,使用不允许空值的kCFTypeDictionaryValueCallBacks回调。特别是,词典与NSDictionary兼容。我认为是这种情况,除非API具体记录为返回其他类型的字典。

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

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

最后,如果您正在使用可能包含空值的字典,则应使用kABPersonAddressCountryKey获取值(如果存在),并且还返回一个布尔值,指示是否存在,一次性调用。如果该函数返回true并将空值存储在您提供的地址作为CFDictionaryGetValueIfPresent()参数的存储中,则字典包含空值。如果返回false,则不包含密钥。如果它返回true并且返回非空值,那么它就是它包含的值。

答案 1 :(得分:0)

我最终将CFDictionaryRef转换为NSDictionary,因此我可以调用[dictionary objectForKey ...并正确检查nill值。

检查nil值而非NULL值时,代码有效。

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


    }else{

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

    }