Iphone 将异常获取为";集合在枚举时发生了变异;

Iphone 将异常获取为";集合在枚举时发生了变异;,iphone,objective-c,Iphone,Objective C,当我使用这段代码时,任何人都可以建议我如何摆脱这段代码 PaymentTerms * currentElement; for (currentElement in termsArray) { printf("\n currentElement Value........%s",[currentElement.days UTF8String]); printf("\n Str value...%s",[Str UTF8String]); NSRange range = [c

当我使用这段代码时,任何人都可以建议我如何摆脱这段代码

PaymentTerms * currentElement;
for (currentElement in termsArray)
{
    printf("\n currentElement Value........%s",[currentElement.days UTF8String]);
    printf("\n Str value...%s",[Str UTF8String]);
    NSRange range = [currentElement.days rangeOfString:Str options:NSCaseInsensitiveSearch];
    if(!(range.location != NSNotFound))
    {
        PaymentTerms *pTerm1 = [[PaymentTerms alloc]init];
        pTerm1.days = Str;
        printf("\n  pTerm1.days...%s",[ pTerm1.days UTF8String]);
        [termsArray addObject:pTerm1];
    }   
}
希望我能得到你方的快速回复。 提前感谢,,
莫尼什语。

这一行
[termsArray addObject:pTerm1]

将抛出该异常。不能从for each循环内的数组中添加/删除元素
for(术语数组中的currentElement)

在集合上循环时,将对象添加到集合中,这就是导致错误的原因。如果
语句嵌套在
for

中,则会发生错误,因为您正在for循环中将新对象添加到termsArray中

  • 创建新的空数组(例如newTermsArray)
  • 在第一个循环中,创建这些新项并将其添加到newTermsArray
  • 然后需要第二个循环将newTermsArray中的项添加回原始termsArray

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

PaymentTerms * currentElement;
NSMutableArray* tempArray = [NSMutableArray array];
for (currentElement in termsArray)
{
    NSRange range = [currentElement.days rangeOfString:Str options:NSCaseInsensitiveSearch];
    if(!(range.location != NSNotFound))
    {
       PaymentTerms *pTerm1 = [[PaymentTerms alloc]init];
       pTerm1.days = Str;
       [tempArray addObject:pTerm1];
       [pTerm1 release];
    }   
}
[termsArray addObjectsFromArray: tempArray];
注意:不要忘记释放您创建的对象-您的代码包含内存泄漏

作为对海报评论(和实际任务)的回应,我认为最简单的方法是制作bool标志,指示是否在周期中找到了日值。如果没有-在循环结束后添加新对象:

PaymentTerms * currentElement;
BOOL dayFound = NO;
for (currentElement in termsArray)
{
    NSRange range = [currentElement.days rangeOfString:Str options:NSCaseInsensitiveSearch];
    if(range.location != NSNotFound)
        dayFound = YES;
}
if (!dayFound)
     // Create and add new object here

是的…我们无法在数组更新时进行枚举…这可能会激怒来自ActionScript背景的程序员。有时情况会更糟,例如“在枚举数组计数时更新数组计数时,在运行时甚至不会出现崩溃或提示”-此时执行行为异常

顺便说一句,您可以使用这种类型的实现,您可以对代码进行一些小的更改

 for (int i=0 ; i< termsArray.count ;i++)  //counting termsArray on every iteration
 {
  id currentElement  = [ termsArray objectAtIndex:i];
  ......
  .....
 }
for(int i=0;i

当然,这个(i使用try-And-catch来处理nsmutable数组中的异常

@try {
    //code for accessing element.

    }
    @catch (NSException *exception) {


       /// show exception here

    }

只是在一个相当复杂的应用程序中处理了相同的错误。解决方案很简单-创建一个副本并使用数组的副本(如果需要,请将其从原始副本中删除。然后放弃该副本)

for(CharacterModelNode* node in self.allPlayers)
{
   // Some operation that may mutate allPlayers (ex: player dies from poison damage and is removed from this array at some other part of an app)

}

//workaround in some cases - create a copy of array and run operations that can kill player on this array (it will not be mutated anywhere else in the app

NSArray* allPlayersCopy = [self.allPlayers copy];

for(CharacterModelNode* node in allPlayersCopy)
{
    [node.character refreshBuffs];
}

谢谢你的有用代码。但我还有一个问题。事实上,我需要检查字符串数组,如果它不存在,我必须将它添加到数组列表中。现在的问题是,我的列表中有3项与我正在搜索的字符串不相等,因此它添加了对象3次而不是1次。还有其他建议吗是的。您不需要在此处释放tempArray,因为您从未拥有它。另外,
!(range.location!=NSNotFound)
(range.location==NSNotFound)相同
@vodkhang,不要这样做。如果termsArray中的任何对象的day属性与Strops不同,你只需添加一个新元素,该死。这是一个愚蠢的错误:)。如果他不想复制新数组中的值(例如,当使用大型数组以避免浪费内存时),他可以简单地使用循环的标准。这并不能回答OP的问题。请再读一遍这个问题并考虑弗拉迪米尔的回答。