2017-10-10 98 views
0

我使用的xcode 9的NSMutableArray replaceObjectAtIndex崩潰

NSMutableArray *Upcase_Keys = @[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]; 
NSString *str = [Upcase_Keys objectAtIndex:0]; 
str = @"test"; 
[Upcase_Keys replaceObjectAtIndex:0 withObject:str]; 

獲取特定數據的NSMutableArray

它把所述值並覆蓋現有的索引。

但是,此代碼會導致崩潰。

我做錯了什麼?

回答

0

您已定義爲不可變對象,語法將分配NSArray引用而不是NSMutableArray。你不能更新NSArray。

嘗試這樣,

NSMutableArray *Upcase_Keys = [NSMutableArray arrayWithArray:@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]]; 
+0

感謝您指出的問題。 :D –

1

的NSMutableArray replaceObjectAtIndex崩潰

所以應該有控制檯的錯誤。控制檯將在發生崩潰時幫助您處理99%的情況,請閱讀! 它應該是像-[NSArrayI replaceObjectAtIndex:withObject:] unrecognized selector sent to instance。這是你錯誤的重要部分。 NSArrayI含義NSImmutableArrayNSArray換句話說),它不是NSMutableArray,它指出問題是關於創建Upcase_Keys

爲什麼呢?因爲@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"];這是NSArray的簡短語法,而不是NSMutableArray。所以即使它被聲明爲NSMutableArray,該對象實際上也是NSArray。 事實上,如果你願意聽的XCode,它應該給你這樣的警告:

不兼容的指針類型與類型'NSArray *'

這一切之前說的協合的 表達初始化'NSMutableArray *'。 `有時XCode可能是錯誤的,但試着聽它。

有幾個可能性撥打:

NSMutableArray *Upcase_Keys = [NSMutableArray arrayWithArray:@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]]; 
NSMutableArray *Upcase_Keys = [[NSMutableArray alloc] initWithArray:@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"]]; 
NSMutableArray *Upcase_Keys = [@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"] mutableCopy]; 

最後,建議使用駝峯: 避免命名你的變種以大寫。對第一個字母使用小寫字母。我想說,在_問題較少之後,我們傾向於在iOS中編寫代碼。

Upcase_Keys =>upcase_Keys =>upcaseKeys

+0

哦;謝謝xD –