Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法对我的可变数组进行排序_Ios_Sorting_Nsmutablearray_Alphabetical - Fatal编程技术网

Ios 无法对我的可变数组进行排序

Ios 无法对我的可变数组进行排序,ios,sorting,nsmutablearray,alphabetical,Ios,Sorting,Nsmutablearray,Alphabetical,因此,我使用以下方法按字母顺序对NSMutableArray进行排序,效果非常好 [myArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 但这对我的数组起到了作用,因为在下面一行崩溃后,我无法将其添加到数组中 [myArray addObject:textBox.text]; 我得到以下错误 *** Terminating app due to uncaught exception 'NSInterna

因此,我使用以下方法按字母顺序对NSMutableArray进行排序,效果非常好

[myArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
但这对我的数组起到了作用,因为在下面一行崩溃后,我无法将其添加到数组中

[myArray addObject:textBox.text];
我得到以下错误

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
我知道这与排序函数有关,因为这个问题只有在我修改可变数组时才会发生!有人能理解为什么会这样吗

不知道为什么它说它是一个不可变的对象,当然是一个我正在使用的可变数组

@property (strong, nonatomic) NSMutableArray *myArray;
这是代码的其余部分

@synthesize myArray;

myArray=[[NSMutableArray alloc] initWithObjects:@"numberOne",@"numberTwo",@"numberThree",@"numberFour",@"numberFive", nil];
NSUserDefault代码

myUserDefault = [NSUserDefaults standardUserDefaults];
myArray = [myUserDefault objectForKey:@"stuff"];
[myUserDefault synchronize];
请看我的回答:

事实上,事实是完全相同的。仅仅声明某事物的类是不够的。那个东西一定是那个类(多态性)。一个实例有一个类(作为它的内部事实),完全不考虑如何强制转换或声明一个仅引用它的变量

因此,您将发现,无论您实际如何制作或获取此数组,它都是一个不可变数组(NSArray);仅仅声称它是可变的,就像你正在做的那样,不会使它成为可变的。事实有其自身的力量

编辑:事实证明确实如此。实际上,你说:

myArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"stuff"];
现在,
myArray
是一个不可变的数组,无论您如何声明
myArray
。修复方法是执行
可变复制

myArray = [[[NSUserDefaults standardUserDefaults] objectForKey:@"stuff"] mutableCopy];

使用
NSUserDefaults
时,返回数组应为
NSArray
,而不是
NSMutableArray

myUserDefault = [NSUserDefaults standardUserDefaults];
myArray = [[NSMutableArray alloc] initWithArray:[myUserDefault objectForKey:@"stuff"]];
[myUserDefault synchronize];

显示实际创建数组的代码。发布完整版本的代码,包括如何初始化speciesArray,这将提供线索,因为现在基本上错误消息是说myArray是NSArray而不是NSMutableArray。Not NSArray还有sortUsingSelector,它返回排序后的数组。您应该确保myArray实际上是一个NSMutableArray,而不是一个NSArray。您可以显示初始化属性的代码行吗?@InsertWittyName Posted!您发布的代码中没有任何内容可以将可变数组转换为不可变数组。在对数组进行排序和尝试添加对象之间,您是否对该数组执行了其他操作?您的意思是我必须创建一个NSMutableArray类的子类?我的意思是您必须以某种方式创建或获取一个NSMutableArray,而您目前没有这样做。我之所以知道这一点,是因为错误是这样写的:
-[\u NSCFArray insertObject:atIndex:
意味着您此时正在与一个属于NSArray类集群的\uu NSCFArray对话。如果说
myArray
在你说
sortUsingSelector:
时是可变的,但在你说
insertObject:atIndex:
时是不可变的(或其他),那么它就发生了变化。也许你说的是复制。也许你做了一个全新的东西。我不知道;您没有显示足够的代码。顺便说一句,您之前说过这被称为
speciesrarray
,然后对其进行了更改,这很奇怪。这让我觉得您的代码中有一些地方报告得不准确。复制粘贴即可。不要弄乱你的代码。向我们展示实际的代码,并向我们展示足够多的代码,而不仅仅是一些小片段。是的,就是这样。当它从默认值中出现时,它是不可变的。调用
mutableCopy
使其再次可变!很抱歉坚持下去,但我想强调一下这里学到的教训。(1) 相信运行时间;它知道的比你多。你的陈述“不确定为什么它说它是一个不可变的对象,肯定是一个我正在使用的可变数组”是完全错误的态度。(2) 少假设;您最初的声明“我知道它与排序功能有关”只是仓促下结论。编程需要一种开放性,做出假设或匆忙下结论会让你对其他可能性视而不见。
myUserDefault = [NSUserDefaults standardUserDefaults];
myArray = [[NSMutableArray alloc] initWithArray:[myUserDefault objectForKey:@"stuff"]];
[myUserDefault synchronize];