2017-10-10 110 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 –