Ios nsmutablearray满足NSGenericeException';集合在枚举时发生了变异';

Ios nsmutablearray满足NSGenericeException';集合在枚举时发生了变异';,ios,exception,nsmutablearray,Ios,Exception,Nsmutablearray,昨天我遇到了一个名为“Collection在被枚举时发生了变异”的异常,并看到了一些解决方案。我有另一个想法。如果我设置了一个名为“lock”的参数,每次枚举时我都会锁定它,然后在枚举后将其解锁。每次操作它时,如枚举或添加对象,我都会先锁定它,然后在操作后将其解锁。 有人能告诉我它是否有效吗?你应该复制一下。如果是数组,请执行以下操作: NSArray *arrayToEnumerate = [myMutableArray copy]; 现在枚举,您就不必担心不可变数组会被更改。我解决了它。其

昨天我遇到了一个名为“Collection在被枚举时发生了变异”的异常,并看到了一些解决方案。我有另一个想法。如果我设置了一个名为“lock”的参数,每次枚举时我都会锁定它,然后在枚举后将其解锁。每次操作它时,如枚举或添加对象,我都会先锁定它,然后在操作后将其解锁。
有人能告诉我它是否有效吗?

你应该复制一下。如果是数组,请执行以下操作:

NSArray *arrayToEnumerate = [myMutableArray copy];

现在枚举,您就不必担心不可变数组会被更改。

我解决了它。其中一个问题是关于线程安全。使用

    @synchronized (yourobject)
    {
    //do something with your object
    }
这将起作用。这意味着它将锁定“yourobject”,以便其他线程无法修改它。然后在“}”之后解锁它

另一个是关于删除数组中对象的代码。如果立即删除,将遇到名为“枚举时集合发生了变化”的异常。创建一个临时数组以包含要删除的对象,然后在for循环后将其全部删除

 NSMutableArray *toDestroy = [NSMutableArray arrayWithCapacity:_contactor.count];
    for(Man *sprite in self.contactor)
    {
        if (sprite.hp<=0 && sprite.stat == stat_attack)
        {
            [sprite stopAllActions];
            [sprite animDead];
            [toDestroy addObject:sprite];
        }
    }
    [self.contactor removeObjectsInArray:toDestroy];
NSMutableArray*toDestroy=[NSMutableArray阵列容量:_contactor.count];
用于(自接触器中的人*精灵)
{

if(sprite.hp在枚举数组时无法更改数组。作为一种解决方法,您应该在临时数组中累积新对象,并在枚举后添加它们:

NSArray *tempArray = [yourArray copy];

for(id obj in tempArray) {
    //It's safe to remove objects from yourArray here.

}
[tempArray release];

我问了一个类似的问题,这可能会有所帮助:我只想知道这个解决方案是否有效:)我将更改对象中的一些变量。这是对常规对象的更改吗?我不明白您刚才问的问题。这样复制只会阻止修改数组…在枚举时不会对数组进行添加/删除。您仍然可以修改单个对象(大概是这样的)数组中只有指向它们的指针,但这不重要。如果可以将对象设置为在枚举过程中会导致问题的值,则只需在枚举中添加某种类型的错误检查。
NSArray *tempArray = [yourArray copy];

for(id obj in tempArray) {
    //It's safe to remove objects from yourArray here.

}
[tempArray release];