即使使用if / else语句,空值也会导致崩溃?

时间:2016-04-05 18:23:42

标签: ios objective-c

我遇到了最奇怪的问题。我正在使用以下代码显示登录用户的个人资料照片(我正在从Drupal数据库中的字段中检索图像)。

的.m

//USER PHOTO

    NSDictionary *user = [[DIOSSession sharedSession] user];
    NSString *secondLink = user[@"field_photo_path"][@"und"][0][@"safe_value"];

    NSLog(@"This is second link %@", secondLink);

 if([secondLink length]>0) {


    NSString *ImageURL = secondLink;
   NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
 //   self.imageView.image = [UIImage imageWithData:imageData];
   self.imageView.image = [[UIImage alloc] initWithData:imageData];

  } else {

   NSString *ImageURL = @"http://url.com/default.png";
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
   self.imageView.image = [UIImage imageWithData:imageData];
}

当然,如果secondLink为空(或为空,例如没有上传照片),我收到以下错误:

  

***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSArray0   objectForKeyedSubscript:]:无法识别的选择器发送到实例   0x14f602fe0'

我以为我用if / else语句解决了这个问题,但显然没有。我该如何解决这个问题?

干杯!

2 个答案:

答案 0 :(得分:0)

NSString *secondLink = user[@"field_photo_path"][@"und"][0][@"safe_value"];

在阅读用户词典之前,您需要验证用户词典是否有效。

if (user[@"field_photo_path"]) {

     // you can look for [@"und"] here
     // providing it is a dictionary and not an array
     if([user[@"field_photo_path"] isKindOfClass:[NSDictionary class]]){
         if (user[@"field_photo_path"][@"und"]) {
            // etc
         }
    }
}

您可以通过将User类建模为NSObject子类来减少此嵌套代码,并在该类中包含方法以安全地解析此数据,从而允许您仅在一个位置编写此验证代码。

修改 如评论中所述:

如果user[@"field_photo_path"][@"und"]中的数据是NSDictionary而不是NSArray,则无法使用[0]访问该数据并导致崩溃。您使用索引(NSArray'sarray[0]等)访问array[1],使用密钥NSDictionarydict[@"name"]等访问dict[@"und"]

答案 1 :(得分:0)

解决方案是检查你的密钥

// USER PHOTO

NSDictionary *user = [[DIOSSession sharedSession] user];
if (user[@"field_photo_path"]) {


    if ([user[@"field_photo_path"] isKindOfClass:[NSDictionary class]]) {

        if (user[@"field_photo_path"][@"und"]) {
            if ([user[@"field_photo_path"][@"und"]isKindOfClass:[NSArray class]]) {

                if ([user[@"field_photo_path"][@"und"] count]>0) {

                    if (user[@"field_photo_path"][@"und"][0][@"safe_value"]) {

                        if ([user[@"field_photo_path"][@"und"][0][@"safe_value"] isKindOfClass:[NSDictionary class]]){

                            NSString *secondLink = user[@"field_photo_path"][@"und"][0][@"safe_value"];

                            NSLog(@"This is second link %@", secondLink);

                            if([secondLink length]>0) {


                                NSString *ImageURL = secondLink;
                                NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
                                //   self.imageView.image = [UIImage imageWithData:imageData];
                                self.imageView.image = [[UIImage alloc] initWithData:imageData];

                            } else {

                                NSString *ImageURL = @"http://url.com/default.png";
                                NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
                                self.imageView.image = [UIImage imageWithData:imageData];
                            }
                        }


                    }
                }

            }
        }

    }
}

您也可以使用try catch块来避免崩溃

@try {
    //USER PHOTO

    NSDictionary *user = [[DIOSSession sharedSession] user];
    NSString *secondLink = user[@"field_photo_path"][@"und"][0][@"safe_value"];

    NSLog(@"This is second link %@", secondLink);

    if([secondLink length]>0) {


        NSString *ImageURL = secondLink;
        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
        //   self.imageView.image = [UIImage imageWithData:imageData];
        self.imageView.image = [[UIImage alloc] initWithData:imageData];

    } else {

        NSString *ImageURL = @"http://url.com/default.png";
        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
        self.imageView.image = [UIImage imageWithData:imageData];
    }
}
@catch (NSException *exception) {
    //Handle expecption
}
@finally {

}