因为“集合被枚举时发生了变化”而得到的异常
我得到的集合被枚举异常时发生了异常,当我使用此代码时,任何人都可以告诉我如何摆脱这种情况。因为“集合被枚举时发生了变化”而得到的异常
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
该行[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
}
这不会回答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];
}
感谢您有用code.but我有一个更problem.Actually事情是我需要检查字符串数组,如果它不存在,我必须将它添加到阵列list.Now问题我有3个项目在我的列表中,这不等于我正在寻找的字符串,所以它将3次而不是1次添加对象。是否有任何其他建议。 – 2010-08-06 15:14:25
您不需要在此处释放tempArray,因为您从不拥有它。另外,'!(range.location!= NSNotFound)'和'(range.location == NSNotFound)'是一样的。 – JeremyP 2010-08-06 15:15:14
@vodkhang,不这样做,你只要添加一个新的元素,如果任何在termsArray中的对象的日期属性不同于Str – Vladimir 2010-08-06 15:25:15