NSMutableArray replaceObjectAtIndex崩溃

时间:2017-10-10 07:34:02

标签: ios objective-c xcode nsmutablearray

我使用xcode 9

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的特定数据

它会转换值并覆盖现有索引。

但是,此代码会导致崩溃。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

  

NSMutableArray replaceObjectAtIndex Crash

所以控制台应该有错误。当发生崩溃时,控制台将帮助您99%的情况,阅读它! 它应该是-[NSArrayI replaceObjectAtIndex:withObject:] unrecognized selector sent to instance之类的东西。这是您错误的重要部分。 NSArrayI表示NSImmutableArray(换句话说,NSArray),而不是NSMutableArray,指出问题与Upcase_Keys的创建有关。

为什么呢?因为@[@"1",@"2",@"3",@"4,"@"5",@"6",@"7",@"8",@"9",@"0"];NSArray的简写语法,而不是NSMutableArray。因此,即使它被声明为NSMutableArray,该对象实际上也是NSArray。 事实上,如果你听XCode,它应该给你这个警告:

  

使用a初始化'NSMutableArray *'的指针类型不兼容   类型'NSArray *'

的表达式

以前所说的一切都与之相符。有时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];

最后,建议使用 camelcase : 避免使用大写命名var。第一个字母使用小写字母。我说在_问题较少之后,我们倾向于在iOS中编写代码。

Upcase_Keys => upcase_Keys => upcaseKeys

答案 1 :(得分:0)

您已定义为不可变对象,语法将指定NSArray引用而不是NSMutableArray。您无法更新NSArray。

试试这个,

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