如何在CFDictionaryRef中检查空值?
我测试了这段代码以检查空值,但它没有得到任何值。
CFDictionaryRef dict = ABMultiValueCopyValueAtIndex((addresses), i);
NSString * kCountry;
if (dict != NULL && CFDictionaryContainsKey(dict, CFSTR("kABPersonAddressCountryKey")))
{
kCountry = CFDictionaryGetValue(dict, CFSTR("kABPersonAddressCountryKey"));
}
答案 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"));
}