2015-10-19 9 views
1

Я использовал Zbar SDK (1.2) в своем проекте.Crash on ZBarSymbolSet

Это крах сообщил многими пользователями за последние 8-9 месяцев:

Message = * Нагрузочный приложение из-за неперехваченного исключением «NSGenericException», причина: «* Collection мутировали в то же время перечисленные «.

Код:

- (void) imagePickerController: (UIImagePickerController*) reader 
didFinishPickingMediaWithInfo: (NSDictionary*) info 
{ 
    // ADD: get the decode results 
    id<NSFastEnumeration> results = 
    [info objectForKey: ZBarReaderControllerResults]; 
    ZBarSymbol *symbol = nil; 
    NSLog(@"%@",results); 

    for(symbol in results) 
     // EXAMPLE: just grab the first barcode 
     break; 

Что является причиной этой проблемы?

ответ

0

Я знаю, что это уже поздно, но, возможно, это помогает будущим читателям.

Моя теория заключается в том, что библиотека удаляет один или несколько наборов объекта результатов, в то время как приложение перечисляет через них. Я решил эту проблему с категорией, которая делает ZBarSymbolSet совместимой с NSCopying. Это позволяет мне скопировать набор и перечислить копию. Категория:

@interface ZBarSymbolSet (AllowCopy) <NSCopying> 

@end 

@implementation ZBarSymbolSet (AllowCopy) 

- (id)copyWithZone:(NSZone *)zone 
{ 
    id copy = [[[self class] alloc] initWithSymbolSet:self.zbarSymbolSet]; 
    return copy; 
} 

@end 

Код:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    id result = [info valueForKey:ZBarReaderControllerResults]; 

    if ([result isKindOfClass:[ZBarSymbol class]]) 
    { 
     ZBarSymbol *symbol = (ZBarSymbol *)result; 
     // DO SOMETHING WITH SYMBOL 
    } 
    else if ([result isKindOfClass:[ZBarSymbolSet class]]) 
    { 
     ZBarSymbolSet *set = (ZBarSymbolSet *)result; 

     ZBarSymbolSet *copySet = set.copy; 
     for (ZBarSymbol *symbol in copySet) 
     { 
      // DO SOMETHING WITH SYMBOL 
     } 
    } 
}