我是Obj C编程的新手,所以我将从头开始 我有一个带有一些NSNumber和NSString元素的数组,我想将NSString elems替换为NSNumber elems。我决定在构造中使用for new NSMutableArray所有元素值和NSMutableIndexSet它们的索引,但是当我这样做时我面临麻烦,在这里它是,我告诉你我的代码和日志。
NSArray *oneMoreStack = [program copy];
NSLog(@" stack=%@",oneMoreStack);
NSLog(@" show me index ind=%@",[oneMoreStack indexOfObject:@"x"]);
NSMutableIndexSet *myVarIndexesSet;
NSMutableArray *myVarsArray;
for (id myVarConst in oneMoreStack) {
if([myVarConst isKindOfClass:[NSString class]])
{
if([myVarConst isEqualToString:@"x"]){
[myVarsArray addObject:myVarConst];
NSLog(@"obj x=%@",myVarConst);
[myVarIndexesSet addIndex:[oneMoreStack indexOfObject:myVarConst]];
NSLog(@"ind x=%@",[oneMoreStack indexOfObject:myVarConst]);
}
}
当我运行它时,log告诉我:
Calculator[6306:f803] stack=(
x,
2,
"+"
)
Calculator[6306:f803] show me index ind=(null)
Calculator[6306:f803] obj x=x
Calculator[6306:f803] ind x=(null)
then crash [NSMutableArray replaceObjectsAtIndexes:withObjects:]: index set cannot be nil
所以,我的问题是为什么 [oneMoreStack indexOfObject:myVarConst]
会返回 null
?我该如何解决?谢谢。
我之前没有提到过这段代码,因为认为问题在于获取索引。
在上一部分代码出现之后:
[stack replaceObjectsAtIndexes:[myVarIndexesSet copy] withObjects:[myVarsArray copy]];
之后我提到的错误报告崩溃了。谢谢。
答案 0 :(得分:4)
[oneMoreStack indexOfObject:myVarConst]
返回一个NSUInteger,一个基本类型,而不是一个对象。
在你的NSLog中,你正在使用%@,它说“嘿,把这个对象我作为一个参数传递,在它上面调用-description
,并打印出来”。幸运的是,你传入的NSUInteger碰巧是0,NSLog认为它是一个空对象,你没有崩溃。如果对-indexOfObject:的调用返回非0,则可能会崩溃。
请改为尝试:
// For iOS
NSLog(@" show me index ind=%u", [oneMoreStack indexOfObject:@"x"]);
或
// For 64-bit and 32-bit Mac OS X
NSLog(@" show me index ind=%lu", (unsigned long)[oneMoreStack indexOfObject:@"x"]);
您可以在以下位置详细了解字符串格式: Formatting String Objects