使用appendString for NSMutableString时应用程序崩溃

时间:2012-07-17 06:06:45

标签: iphone xcode nsmutablearray nsmutablestring

我是Objective-c的新手,我决定首先完成斯坦福大学CS193s 2010F会议的讲座/作业。

我正在进行第二项任务,当我不得不返回一个结合(连接)NSMutableArray内的每个字符串的NSString时,我陷入困境。 (MutableArray在其每个索引处仅包含NSString)

我的方法是使用for循环来传递MutableArray的标记(在下面的代码中,MutableArray是'anExpression',类型为'id')。我声明了一个NSMutableString并在'anExpression'数组的每个索引处添加了NSString。这是代码:

+ (NSString *)descriptionOfExpression:(id)anExpression{
  NSMutableString *result = [NSMutableString string];

  for (int i = 0;i<[anExpression count];i++){
    [result appendString:[anExpression objectAtIndex:i]];
  }

  return result;
}

然而,

 [result appendString:[anExpression objectAtIndex:i]];

xcode崩溃并出现以下错误陈述:

2012-07-17 01:44:51.014 Calculator[9470:f803] -[__NSCFNumber length]: unrecognized selector sent to instance 0x68732c0
2012-07-17 01:44:51.015 Calculator[9470:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0x68732c0'
*** First throw call stack:
(0x13ca022 0x155bcd6 0x13cbcbd 0x1330ed0 0x1330cb2 0x12d2d18 0x13460d7 0x1397a8d 0x3a50 0x27ed 0x13cbe99 0x1714e 0x170e6 0xbdade 0xbdfa7 0xbd266 0x3c3c0 0x3c5e6 0x22dc4 0x16634 0x12b4ef5 0x139e195 0x1302ff2 0x13018da 0x1300d84 0x1300c9b 0x12b37d8 0x12b388a 0x14626 0x1ed2 0x1e45 0x1)
terminate called throwing an exception

我查看了Apple的开发人员的文档,看到了'NSString stringWithFormat:'方法,并决定使用这种方法:

+ (NSString *)descriptionOfExpression:(id)anExpression{
  NSMutableString *result = [NSMutableString string];

  for (int i = 0;i<[anExpression count];i++){
    [result appendString:[NSString stringWithFormat:@"%@",[anExpression objectAtIndex:i]]];
  }

  return result;
}

现在有效。

现在我很困惑为什么第二个代码有效,但第一个代码没有。 我认为附加字符串只有在传递给nil时才会失败(并崩溃)...

我有什么遗失的吗?

提前谢谢你:)

3 个答案:

答案 0 :(得分:1)

看起来anExpression的内容是NSNumber而不是NSString的实例。你得到的错误是关于appendString如何工作的提示;它的第一步显然是要求传递的“字符串”多长时间(可能是因为它可以分配足够的内存)。这显然不是NSNumber上的方法(因此崩溃),而stringWithFormat旨在进行类型检查并且更灵活。

我怀疑你也可以使用stringValue

[result appendString:[[anExpression objectAtIndex:i] stringValue]];

答案 1 :(得分:1)

+ (NSString *)descriptionOfExpression:(id)anExpression{

      NSMutableString *result = [NSMutableString string];

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

              [result appendString:[[anExpression objectAtIndex:i] stringValue]];

         }

  return result;
}

将它转换为字符串可以帮助你!!

答案 2 :(得分:0)

使用此功能:

+ (NSString *)descriptionOfExpression:(id)anExpression
{
     NSMutableString *result = [[NSMutableString alloc] init];

    for (int i = 0;i<[anExpression count];i++)
    {
        NSString *str = [NSString stringWithFormat:@"%@",[anExpression objectAtIndex:i]]; 

        if(str)
        { 
            [result appendString:str];
        }

        //OR
        //[result appendFormat:[NSString stringWithFormat:@"%@",[anExpression objectAtIndex:i]]]; 

    }

    return result;
}