如何在iphone中处理数组中的nil值

时间:2014-01-05 08:36:41

标签: iphone objective-c nsstring

我正在尝试保存已解析xml内容的数组元素。在NSLog中显示的数组元素如下

ARRAY ELEMENTS (
)
2014-01-05 13:47:22.953 test[895:a0b]  ARRAY ELEMENTS (
)
2014-01-05 13:47:22.953 test[895:a0b]  ARRAY ELEMENTS (
)
2014-01-05 13:47:22.954 test[895:a0b]  ARRAY ELEMENTS (
)
2014-01-05 13:47:22.954 test[895:a0b]  ARRAY ELEMENTS (
)
2014-01-05 13:47:22.955 test[895:a0b]  ARRAY ELEMENTS (
    "M |HELLO| |HI|",
    "M |HELLO |HI|"

 )

当我尝试使用以下代码访问数组元素并获取通过[pipe]“|”分隔字符串的子字符串

for (int i =0; i < [finalArray count]; i++) {

    NSString *substring = [[NSString alloc]init];
    substring = [finalArray objectAtIndex:i];
    if ([NSNull null] == [finalArray objectAtIndex:i]) {
         NSLog(@"array object has nil value");             
    }
    else{
         NSArray *splitArray = [NSArray alloc];
         splitArray = [substring componentsSeparatedByString:@""];
         [finalSplitSMSArray addObject:splitSMSArray];
         splitSMSArray = [[NSArray alloc]init];
    }    
}

但例外情况如下:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM componentsSeparatedByString:]: unrecognized selector sent to instance 0x8999fa0'
*** First throw call stack:
(
    0   CoreFoundation      

4 个答案:

答案 0 :(得分:2)

我不知道你想在这里完成什么,但似乎你需要很多帮助:)

让我们首先评论一些观点:

  1. 您无法为数组添加nil值,这意味着您无需检查它。
  2. 由于此处有内存泄漏,您必须将NSString *substring = [[NSString alloc]init];更改为NSString *substring = [finalArray objectAtIndex:i];
  3. 您不必分配和初始化splitArray,因为它不会在for循环后使用。
  4. 您的问题的答案:您获得的异常不是因为空值,而是意味着您尝试将消息“componentsSeparatedByString:”发送到nsarray而不是nsstring。 / p>

      

    确保finalArray包含nsstring对象而不是nsarray。

    3-简化它尝试用这个改变你的代码:

    for (int i =0; i < [finalArray count]; i++) 
    {
        NSString *substring = [finalArray objectAtIndex: i];
    
        if (![substring isKindOfClass: [NSString class]])
             NSLog(@"this is not a string");
        else
        {
            NSArray *splitArray = [substring componentsSeparatedByString:@""];
            [finalSplitSMSArray addObject:splitSMSArray];
        }
     }
    

答案 1 :(得分:0)

您可以尝试测试是否[substring length] == 0.

答案 2 :(得分:0)

错误消息'-[__NSArrayM componentsSeparatedByString:]...表示方法componentsSeparatedByString:已发送到NSMutableArray的实例。

因此,即使您已将substring声明为NSString,但在运行时它也会充当NSMutableArray

我的建议是错误位于代码示例之外的某处。

答案 3 :(得分:0)

在我看来,数组中的nil值不是问题,在nil上调用方法将不起作用。 在调试器中查看此行substring变量中的内容

splitArray = [substring componentsSeparatedByString:@""];

表示此时substringNSArray对象,并且您正在尝试执行它没有'的方法componentsSeparatedByString:实施

我会改变这个:

NSArray *splitArray = [NSArray alloc];

进入这个:

NSArray *splitArray = [[NSArray alloc]init];
你可能错过了它:)

所以最终的代码看起来像这样:

for (id item in finalArray) 
{
    if(![item isKindOfClass:[NSString class]]){
        continue;
    }

    NSArray *splitArray = [item componentsSeparatedByString:@""];
    [finalSplitSMSArray addObject:splitArray];
}