【问题标题】:'Mutating method sent to immutable object error' in XcodeXcode中的“发送到不可变对象错误的变异方法”
【发布时间】:2026-01-07 22:20:05
【问题描述】:

我不确定当我以某种方式运行程序时为什么会出现此错误。

2014-05-15 16:19:28.932 Puzzle[1002:f803] *** WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: <NSInternalInconsistencyException> -[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object

我有一个名为“levelsCompleteArray”的 NSMutableArray,我试图循环查看第一个 NO(或 0)何时出现,并将该迭代设置为一个名为“picIndex”的变量。如果数组中没有“是”,则程序可以正常工作。但是,当下一次迭代中有一个时,我会收到上面发布的消息。有谁知道为什么?代码如下:

[levelsCompleteArray replaceObjectAtIndex:picIndex withObject:[NSNumber numberWithBool:YES]];

BOOL wonLevel=NO;

int i=picIndex;

while (wonLevel==NO)
{
    BOOL status =[[levelsCompleteArray objectAtIndex:i] boolValue];
    if (status==1) 
    {
        i=i+1;
        if(i==3)
        {
            picIndex=0;
            wonLevel=YES;
        }
    }
    else
    {
        picIndex=i;
        wonLevel=YES;
    }
} 

【问题讨论】:

  • 猜猜看。 levelsCompleteArray 是不可变的。当我们这样做的时候,清除那个xcode 标签。这无关紧要。

标签: arrays object methods mutable


【解决方案1】:

看起来levelsCompleteArray 是一个不可变的NSArray。要将其转换为可变数组,请尝试以下操作:

NSMutableArray* mutableLevelsCompleteArray = [[NSMutableArray alloc] initWithArray:levelsCompleteArray];

【讨论】:

  • 我现在就试试。 levelsCompleteArray 被声明为:@property (nonatomic, retain) NSMutableArray *levelsCompleteArray;我相信我的代码中的某些内容正在将其更改为不可变。
  • 那行得通。谢谢你。我仍然不确定为什么它会更改为不可变数组,但我会深入研究。