При получении исключения как “Набор был видоизменен, будучи перечисленным”

Я добираюсь, Набор был видоизменен будучи перечисленным исключением, когда я использую этот код, может любой предлагать меня, как выйти из этого.

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.

7
задан vodkhang 6 August 2010 в 15:23
поделиться

5 ответов

Вы не можете изменить массив во время его перечисления. В качестве обходного пути вы должны накапливать новые объекты во временном массиве и добавлять их после перечисления:

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
16
ответ дан 6 December 2019 в 11:45
поделиться

Эта строка [termsArray addObject: pTerm1]; вызовет это исключение. Вы НЕ МОЖЕТЕ добавить / удалить элемент из массива внутри для каждого цикла. for (currentElement in termsArray)

2
ответ дан 6 December 2019 в 11:45
поделиться

Да ... мы не можем перечислить, пока массив обновляется ... Это может раздражать программистов, которые уже знакомы с ActionScript. Иногда дела идут хуже, например: «Вы даже не получите сбой или указание во время выполнения, когда вы обновляете счетчик массива во время его перечисления "- выполнение просто ведет себя ненормально в это время.

Кстати, вы можете пойти на этот тип реализации, где вы можете внести незначительные изменения в свой код.

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

Конечно, This (i

1
ответ дан 6 December 2019 в 11:45
поделиться

вы добавляете объект в свою коллекцию по мере его обхода, вот что вызывает ошибку. ваш оператор if вложен в для

0
ответ дан 6 December 2019 в 11:45
поделиться

Ошибка возникает из-за того, что вы добавляете новые объекты в termsArray внутри цикла for

  • Создайте новый пустой массив (egnewTermsArray)
  • В первом цикле создайте и добавьте эти новые элементы to newTermsArray
  • Затем вам понадобится второй цикл, чтобы добавить элементы из newTermsArray обратно в исходный массив termsArray
0
ответ дан 6 December 2019 в 11:45
поделиться