【问题标题】:[NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object [duplicate][NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object [duplicate]
【发布时间】:2025-12-15 15:20:32
【问题描述】:

已更新这是我的代码;最后一行代码导致了标题中描述的错误。我了解 userDefaults 将始终返回一个不可变对象;那么我该如何解决呢?我尝试将发送字段设为“可变副本”,但它被标记为错误。

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

   if(textField.tag == kStaffName)  {  //  get index of staffName textField
    NSMutableArray *staffNamesArray = [[userDefaults arrayForKey:@"staffNamesArray"] mutableCopy];

    NSInteger indexSelected = [oStaffPickerView selectedRowInComponent:0];

    [staffNamesArray replaceObjectAtIndex:indexSelected withObject:textField.text];

【问题讨论】:

  • @njzk2 绝对不是重复的:代码已经使用了mutableCopy,因此匹配the accepted answer
  • 既然屏幕右边框外巧妙地隐藏了一个“if”,你确定你没有修改任何其他仍然不可变的数组吗?
  • it was flagged as an error。请澄清一下?
  • 你能显示完整的堆栈跟踪吗?是否添加了断点来验证崩溃位置和数组类?
  • @spokane-dude:不做假设,将完整的错误日志添加到您的问题中怎么样?

标签: objective-c nsmutablearray nsuserdefaults ios8.1


【解决方案1】:

你可以试试这个:

NSMutableArray *staffNamesArray = [[NSMutableArray alloc] initWithArray:[userDefaults arrayForKey:@"staffNamesArray"]];

希望对您有所帮助!

【讨论】:

  • 你不应该需要 2 个可变副本
  • 没错,就是复制粘贴。编辑我的回复
  • @Wain: userDefaults 返回一个不可变数组,我认为这是问题的原因。那么,weso 的代码不会使 userDefaults 数组可变吗?
  • 它最初是制作一个可变副本并将其传递给initWithArray:
  • @Wain 我现在明白了...感谢您的帮助,我保证在提出问题时会做得更好...:D