【问题标题】:Cant sort my NSMutable array无法对我的 NSMutablearray 进行排序
【发布时间】:2014-03-31 01:04:07
【问题描述】:

所以我使用以下按字母顺序对我的 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'

我知道它与排序函数有关,因为这个问题仅在我修改可变数组时出现!谁能理解为什么会这样?

不知道为什么它说它是一个不可变对象绝对是我正在使用的 mutableArray..

@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];

【问题讨论】:

  • 显示你实际创建数组的代码。
  • 发布完整版本的代码,包括如何初始化 speciesArray,这将提供线索,因为现在基本上错误消息是说 myArray 是 NSArray 而不是 NSMutableArray。 Not NSArray 也有 sortUsingSelector 并返回排序后的数组。您应该确保 myArray 实际上是 NSMutableArray 而不是 NSArray
  • 你能显示初始化属性的代码行吗?
  • @InsertWittyName 已发布!
  • 您发布的代码中没有任何内容可以将可变数组转换为不可变数组。在对它进行排序和尝试添加对象之间,您是否对这个数组进行了其他操作?

标签: ios sorting nsmutablearray alphabetical


【解决方案1】:
@property (strong, nonatomic) NSMutableArray *speciesArray;

在这里查看我的答案:

https://stackoverflow.com/a/22748539/341994

事实上,事实完全一样。 声明某物的类别是不够的。那个东西实际上必须那个类(多态性)。一个实例一个类(作为它的内部事实),完全不考虑你如何转换或声明一个仅引用它的变量。

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

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

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

现在myArray 是一个不可变数组,无论您如何声明myArray。解决方法是做一个mutableCopy:

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

【讨论】:

  • 所以你说我必须创建一个继承 NSMutableArray 的类?
  • 我是说你必须以某种方式创建或获取一个 NSMutableArray - 而你目前没有这样做。我知道这一点是因为错误是这样说的:-[__NSCFArray insertObject:atIndex:] 表示您当时正在与 __NSCFArray 交谈,它是 NSArray 类集群的一部分。如果myArray 在你说sortUsingSelector: 时是可变的,但在你说insertObject:atIndex:(或其他任何东西)时是不可变的,那么它发生了改变。也许你说copy。也许你做了一个全新的对象。我不知道;你没有显示足够的代码。
  • 顺便说一句,你之前说这叫speciesArray然后改了,这有点奇怪。这让我觉得你的代码有些东西你没有准确地报告。 只需复制和粘贴。不要弄乱你的代码。向我们展示实际代码,并向我们展示足够的代码,而不仅仅是零散的小片段。
  • 是的,就是这样。当它来自 NSUserDefaults 时,它是不可变的。调用 mutableCopy 使其再次可变!
  • 抱歉坚持,但我想强调这里吸取的教训。 (1) 相信运行时间;它比你知道的多。您的陈述“不确定为什么它说它是一个不可变的对象绝对是我正在使用的 mutableArray”是完全错误的态度。 (2) 假设较少;您最初的陈述“我知道它与排序功能有关”只是得出结论。编程需要一种开放性,做出假设或草率下结论会让你看不到其他可能性。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多