【问题标题】:xcode check if an NSArray exist and contains objects?xcode 检查 NSArray 是否存在并包含对象?
【发布时间】:2012-03-24 11:41:10
【问题描述】:

我正在尝试使用 Apple API 获取一些应用程序信息,这给了我一个包含许多对象的 JSON 文件。

我试图像这样确定应用程序的类型(通用/仅限 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 图像的数组将不存在。知道如何解决这个问题吗?

谢谢。

【问题讨论】:

    标签: iphone json ipad crash


    【解决方案1】:

    JSON 是否包含某个键的值 null

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

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

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

    请注意,类型转换只是为了避免编译器警告。

    【讨论】:

    • 是的,例如,如果应用程序是“仅限 iPhone”,则 Ipad 图像的 NSArray 将不存在。所以我认为这不是重点吗?所以如果我理解我应该这样测试: if ([appDetails objectForKey:@"screenshotUrls"] != (typecast)[NSNull null]) { // 数组存在 }
    • 是的,没错。但是当 JSON 包含 null 作为某个值时,就会发生这种错误。如果密钥不存在,NSDictionary 将只返回nil,不会导致崩溃。您实际上应该首先确认这是原因。虽然在处理 JSON 时,通常使用 NSNull 检查是一个好习惯。
    • 谢谢你,只是一件事,对于我上面列出的代码,是否有可能导致崩溃的错误?即使 NSArray 不存在,我可以写 array.count 吗?谢谢。
    • 如果数组不存在,可以写array.count。但是你必须确定它是一个数组。例如,您的代码应如下所示:id object = [appDetails objectForKey:@"screenshotUrls"]; if ([object isMemberOfClass:[NSArray class]]) {//do stuff with the object as array} 这些小而有用的检查可以使您的代码更加健壮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 2011-08-14
    • 2015-11-10
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多