因为“集合被枚举时发生了变化”而得到的异常

问题描述:

我得到的集合被枚举异常时发生了异常,当我使用此代码时,任何人都可以告诉我如何摆脱这种情况。因为“集合被枚举时发生了变化”而得到的异常

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

希望我能从你方得到快速回复。 预先感谢, Monish。

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

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

P.S.不要忘记发布你创建的pTerm1对象 - 你的代码包含内存泄漏

在回应海报的评论(和实际任务) - 我认为最简单的方法来使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 
+0

感谢您有用code.but我有一个更problem.Actually事情是我需要检查字符串数组,如果它不存在,我必须将它添加到阵列list.Now问题我有3个项目在我的列表中,这不等于我正在寻找的字符串,所以它将3次而不是1次添加对象。是否有任何其他建议。 – 2010-08-06 15:14:25

+0

您不需要在此处释放tempArray,因为您从不拥有它。另外,'!(range.location!= NSNotFound)'和'(range.location == NSNotFound)'是一样的。 – JeremyP 2010-08-06 15:15:14

+0

@vodkhang,不这样做,你只要添加一个新的元素,如果任何在termsArray中的对象的日期属性不同于Str – Vladimir 2010-08-06 15:25:15

该行[termsArray addObject:pTerm1]; 将抛出该异常。你不能为每个循环添加/删除一个数组中的元素。 for (currentElement in termsArray)

你正在向你的集合添加一个对象,因为你正在循环它,那是什么导致了错误。您if语句嵌套内for

,因为你是内增加termsArray新对象的for循环

  • 创建一个新的空数组(egnewTermsArray)
  • 在第一循环创建出现的错误并添加这些新项目newTermsArray
  • 然后,你将需要第二个环路从newTermsArray项目加回原termsArray

是......我们无法一一列举,而阵列得到更新...这可能会惹恼谁是从ActionScript background.Some次事情的程序员更糟的是,“当你更新枚举数时,你甚至不会在运行时发生崩溃或暗示” - 当时执行的行为异常。

顺便说一句,你可以去这种类型的实现,你可以对你的代码做一些小的修改。

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

中 - 当然,这(我< termsArray.count)看起来糟糕,因为我们计算每次迭代的个性化......在这里,这就是诀窍有轻微changes.But我会强烈建议弗拉基米尔作为其明确的阅读实施。

使用try和catch在nsmutable阵列

@try { 
    //code for accessing element. 

    } 
    @catch (NSException *exception) { 


     /// show exception here 

    } 
+1

这不会回答OP的问题,您的新代码是正确的 – 2012-06-06 17:56:24

只是在一个相当复杂的应用程序处理相同的错误处理异常。解决方法很简单 - 创建一个副本并处理数组的副本(并根据需要将其从原始副本中删除),然后丢弃副本。

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