2012-07-17 82 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; 
} 

將其轉換成字符串會幫助你!