2012-05-04 3 views
2

Я пытаюсь найти объект в моем массиве, и если успех мне нужно заменить объект из моего массива нового объектаNSMutableArray заменить объект

for (id existingSig in allSignature) 
    if ([[existingSig objectForKey:@"SignatureName"] isEqualToString:[item objectForKey:@"name"]]) 
    {  
     [allSignature removeObject:existingSig]; 
     [allSignature addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"SignatureIsRich", [item objectForKey:@"name"], @"SignatureName", generatedID, @"SignatureUniqueId", nil]]; 
    } 

У меня есть ошибка «NSCFArray: 0x100551f10> мутировали в то же время перечислены»

ответ

4

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

NSMutableArray *remove = [NSMutableArray array]; 
NSMutableArray *add = [NSMutableArray array]; 
for (id existingSig in allSignature){ 
    if ([[existingSig objectForKey:@"SignatureName"] isEqualToString:[item objectForKey:@"name"]]) 
    {  
     // Add to the array of objects to be removed 
     [remove addObject:existingSig]; 
     // Add to the array of objects to be added 
     [add addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"SignatureIsRich", [item objectForKey:@"name"], @"SignatureName", generatedID, @"SignatureUniqueId", nil]]; 
    } 
} 
[allSignature removeObjectsInArray:remove]; // Remove objects 
[allSignature addObjectsFromArray:add]; // Add new objects 
2

Самый простой способ - сделать копию и перебрать ее, а затем изменить оригинал.

+0

e.g .: 'for (id existingSig in [allSignature copy]) ...'/'for (id existingSig in [[allSignature copy] autorelease]) ...' в зависимости от того, используете ли вы ARC. – hypercrypt

0

У меня есть метод карта массива У меня есть в NSArray категории для этой цели

- (NSArray *) cw_mapArray:(id (^)(id obj))block 
{ 
    NSMutableArray * cwArray = [[NSMutableArray alloc] init]; 
    [self cw_each:^(id obj, NSUInteger index, BOOL *stop) { 
     id rObj = block(obj); 
     if (rObj) { 
      [cwArray addObject:rObj]; 
     } 
    }]; 
    return cwArray; 
} 

таким образом я могу получить новый массив, а затем просто изменить массив с новым массивом. Вы можете изменить cw_each на enumerateObjectsUsingBlock :. В принципе, это просто, если вы хотите сопоставить объект с новым массивом, вы просто возвращаете объект как есть в блоке, в противном случае модифицируете его и возвращаете, или если вы не хотите сопоставлять объект с новым массивом, тогда верните ноль. Это не очень много кода и прекрасно работает.

Смежные вопросы