尝试检索字符串值时发送到实例的无法识别的选择器

时间:2012-03-15 15:56:29

标签: objective-c ios nsmutablearray nsarray

我有一个NSMutablearray,它包含NSArrays(每个数组都包含int和String值)。 当我尝试从第一个数组中检索并显示数据时: 使用int值就可以了,它显示正确。

    NSLog(@"%i",[[[lesQuestions objectAtIndex:0] objectAtIndex:0] intValue]);

但是当我尝试显示字符串值时:

    NSLog(@"%@",[[[lesQuestions objectAtIndex:0] objectAtIndex:1] stringValue]);

我有例外:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString stringValue]: unrecognized selector sent to instance

我绝对肯定int值是第一项(索引0)而String值是第二项(索引1)。 当我记录持有NSArrays的MutableArray时,我得到了正确的值,所以问题在于我猜的项目的引用。

2 个答案:

答案 0 :(得分:6)

数组中的对象已经是NSString,因此不需要调用stringValue。 NSString没有实现一个名为stringValue的方法,因此你看到了异常。就这样做:

NSLog(@"%@",[[lesQuestions objectAtIndex:0] objectAtIndex:1]);

-intValue是一个由NSNumber实现的方法,用于从NSNumber实例中获取整数原语,假设数组中的第一个对象是NSNumber(或者是一个NSNumber),则使用intValue是正确的。 NSString,它也实现了-intValue)。

所有这一切,我一般认为将不同类的实例存储在同一个数组中是一个好主意,就像你正在做的那样。您可能最好使用NSDictionary,其中每个值都使用唯一键存储,例如@"index"表示数字,@"name"表示字符串。

答案 1 :(得分:1)

NSLog分别标准对象显示自己的能力比你想象的更强大。

 NSLog(@"%@",[[lesQuestions objectAtIndex:0] objectAtIndex:0]);
 NSLog(@"%@",[[lesQuestions objectAtIndex:0] objectAtIndex:1]);

除非你有非常多的数组元素,否则你甚至可以发现它很有用:

 NSLog(@"%@",[lesQuestions objectAtIndex:0]);

 NSLog(@"%@",lesQuestions);

试一试!