2012-03-24 125 views
0

我试图获得一些使用Apple API的应用程序信息,它给了我一个包含许多对象的JSON文件。xcode检查一个NSArray是否存在并包含对象?

我试图确定该应用(仅通用/ iPhone只/ ipad公司)这样

if(([[appDetails objectForKey:@"screenshotUrls"] count]>0) && ([[appDetails objectForKey:@"ipadScreenshotUrls"] count]>0)) 
{ 
    cell.appDeviceLabel.text = @"Universal"; 
    cell.appDeviceLabel.backgroundColor = [UIColor colorWithRed:0.012 green:0.467 blue:0.784 alpha:1]; 
} 

else if(([[appDetails objectForKey:@"screenshotUrls"] count]==0) && ([[appDetails objectForKey:@"ipadScreenshotUrls"] count]>0)) 
{ 
    cell.appDeviceLabel.text = @"iPad"; 
    cell.appDeviceLabel.backgroundColor = [UIColor colorWithRed:0.941 green:0.58 blue:0.016 alpha:1];   
}   
else if(([[appDetails objectForKey:@"screenshotUrls"] count]>0) && ([[appDetails objectForKey:@"ipadScreenshotUrls"] count]==0)) 
{ 
    cell.appDeviceLabel.text = @"iPhone"; 
    cell.appDeviceLabel.backgroundColor = [UIColor colorWithRed:0.016 green:0.459 blue:0.129 alpha:1]; 
} 

注意的类型:screenshotUrls是包含图像为iphone版本 ipadScreenshotUrls阵列是一个用于iPad照片。

我在我的应用程序中使用了上面的代码,Apple接受它,但是我收到的崩溃报告显示这些行有问题。

可能是因为我正在测试未找到的数组的计数?因为如果该应用程序仅用于iPhone,则iPad图像阵列将不存在。任何想法如何解决这个问题?

谢谢。

回答

2

对于某些密钥,JSON是否包含值null

如果是,则此值在Obj-C中转换为NSNull,并且传递给此对象的任何方法都会导致崩溃。 (NSNull在这方面与nil不同。)

我经常在Obj-C中因为这个原因而频繁遇到JSON崩溃。在使用任何值之前,您应该先进行检查。

if (value == (typecast)[NSNull null]) { 
    // use the value 
} 

请注意,类型转换仅用于避免编译器警告。

+0

是的,就像我说的例子,如果应用程序是“仅iPhone”,NSArray的Ipad图像将不存在。所以我认为这是不是?所以如果我明白我应该这样测试:if([appDetails objectForKey:@“screenshotUrls”]!=(typecast)[NSNull null]){ //该数组存在 } – hafedh 2012-03-24 12:31:00

+0

是的,这是正确的。但是当JSON包含'null'作为一些值时会发生这种错误。如果该键不存在,'NSDictionary'将返回'nil'并且不会导致崩溃。你应该首先确认这是原因。尽管在处理JSON时,放置'NSNull'检查通常是一种很好的做法。 – Sailesh 2012-03-24 13:09:26

+0

对于我上面列出的代码,谢谢你的任何方式,只是一件事,是否有可能导致崩溃的错误?即使NSArray不存在,我可以写array.count?谢谢。 – hafedh 2012-03-24 13:21:33