我有这一行:
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"); }
}
答案 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
的输入文件有多大?
尝试使用[NSString stringWithString:[line objectAtIndex:1]]
代替stringWithFormat
。基于您对gdb
的使用,可能stringWithFormat
打破了意外的控制字符(并尝试格式化)。 stringWithString
应该逐个字符地复制字符串。删除控制字符是另一个问题。 :)