2012-07-17 83 views
0

我是objective-c的新手,我决定从斯坦福大学CS193s 2010F Session的讲座/作业开始。当使用appendString for NSMutableString时,应用程序崩溃

我正在处理第二个任务,当我不得不返回一个将NSMutableArray中的每个字符串结合(连接)的NSString时,我被卡住了。 (MutableArray只包含每个索引处的NSString)

我的方法是使用for循环来传递MutableArray的指示(在下面的代码中,MutableArray是类型为'id'的'anExpression')。我宣布了一个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 

我通过苹果的开发者文档望去,只见 '的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; 
} 

它现在有效。

现在我很困惑为什么第二个代码有效,但第一个没有。 我认为追加字符串只有当它通过零时失败(并崩溃)...

有什么我失踪了吗?

预先感谢您:)

回答

1

它看起来像anExpression的内容NSNumber的,而不是NSString的实例。你得到的错误是关于appendString如何工作的提示;第一步显然是询问通过的“字符串”它有多长(大概是这样它可以分配足够的内存)。这显然不是NSNumber的一种方法(因此崩溃),并且stringWithFormat被设计用来进行类型检查并且更灵活。

我怀疑你也可以使用stringValue一样好:

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

啊......非常感谢,ctrahey。我太粗心了!看来我的阵列也有NSNumber,不仅NSStrings。感谢ctrahey和Raj。对此,我真的非常感激 :) – aaa 2012-07-17 06:20:13

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; 
} 
+0

感谢您的回答。我注意到你使用if(str)检查数组中的字符串是否为零的情况。 但是,我遇到了麻烦,为什么第一个代码会导致崩溃,第二个代码(这是您提供的类似代码)的作用。 – aaa 2012-07-17 06:15:44

+0

@aaa现在没有崩溃? – Guru 2012-07-17 06:20:33

+0

是的我现在明白了这个问题!真是愚蠢的错误。谢谢你的帮助! – aaa 2012-07-17 06:21:27

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; 
} 

将其转换成字符串会帮助你!