objectAtIndex返回SIGABRT错误

时间:2011-05-27 19:00:17

标签: objective-c

我有这一行:

 NSString *objectkey=[NSString stringWithFormat:@"%@",[line objectAtIndex:1]];

如果objectAtIndex:0,它可以正常工作。但如果为1,它会在运行时产生SIGABRT错误。

但是,我还有另一行确认数组“line”在索引1处有一个对象:

   NSLog(@"%d",[line count]);

这将2返回控制台。

为什么SIGABRT会出现,即使那里应该存在索引?

至于行,它是这样创建的:

for (int i=1;i<=[components count];i++){

    NSArray*line=[[components objectAtIndex:(i-1)] componentsSeparatedByString:@"|"];

“line”在每次循环迭代期间重新创建(我假设这没关系?根据我所理解的使用“by string by string”方法,不需要发布。)

数组“components”包含如下行:

食谱书籍|书籍

食谱照片|照片

我创建了这个小循环来验证所有字符串都在“line”中:

 for( NSObject* obj in line )
    {
        NSLog(@"%@",obj);
        if ([obj isKindOfClass:[NSString class]]==YES) { NSLog(@"string"); }
    }

2 个答案:

答案 0 :(得分:0)

假设在你的行NSArray的索引1处有一个有效的对象,可能的答案是它不是NSString,它是在stringWithFormat:call中使用%@无法翻译的其他类。查看它中止的堆栈,你也可以在调用stringWithFormat:call之前检​​查对象的类型。

答案 1 :(得分:0)

[line objectAtIndex:1]中包含的对象很可能不是NSString*。为什么不尝试迭代line中的对象集并使用NSLog输出它们。我的猜测是第二个打印一个地址(格式<Classname: 0x0>,而不是字符串。

for( NSObject* obj in line )
{
   NSLog(@"%@",obj);
}

在您创建NSLog的代码中添加line

for (int i=1;i<=[components count];i++){
    NSLog(@"%@",[components objectAtIndex:(i-1)]);
    NSArray*line=[[components objectAtIndex:(i-1)] componentsSeparatedByString:@"|"];

我强烈感觉您的输入数据不好,因为您已将我们之前的答案排除在您的回复解决方案之外。您的输入数据可能在某个不属于或缺少数据的位置<cr>components的输入文件有多大?


基于gdb结果的第二个答案

尝试使用[NSString stringWithString:[line objectAtIndex:1]]代替stringWithFormat。基于您对gdb的使用,可能stringWithFormat打破了意外的控制字符(并尝试格式化)。 stringWithString应该逐个字符地复制字符串。删除控制字符是另一个问题。 :)