2016-05-05 13 views
0

Das ist mein Code, ich mehrere Werte auf meinem Zustand bin EntfernenObwohl nach der Sperre die Threads abgestürzt sind, wurde <__ NSArrayM: 0x7f881a6b1900> während der Aufzählung mutiert?

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    PhotoCan *cell=[collectionView cellForItemAtIndexPath:indexPath]; 
    UIImage *getimg=[dicPhotoStore objectForKey:@(indexPath.row)]; 
    BOOL integer=[dic objectForKey:@(indexPath.row)]; 
    if(integer) 
    { 

     for(id img in arrFinalStore) 
     { 
      if(img==getimg) 
      { 


       NSLock *arrayLock = [[NSLock alloc] init]; 
       [arrayLock lock]; 
        [arrFinalStore removeObject:img]; 
       NSLog(@"crash inside"); 
       [arrayLock unlock]; 

      } 

     } 
     @synchronized(self) 
     { 
      [dic removeObjectForKey:@(indexPath.row)]; 
      [dicPhotoStore removeObjectForKey:@(indexPath.row)]; 
     } 
     NSLog(@"crashoutside"); 
     NSLog(@"inside false"); 
    } 
    else 
    { 
     [dicPhotoStore setObject:cell.imgView.image forKey:@(indexPath.row)]; 
     [arrFinalStore addObject:cell.imgView.image]; 
     [dic setObject:@"1" forKey:@(indexPath.row)]; 
    } 
    [_collection reloadData]; 
} 

Ich verstehe etwas versucht schief geht, diesen Fehler zu erfahren, bitte helfen Sie mir, dies zu überwinden.

Dies ist Fehler:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x7f881a6b1900> was mutated while being enumerated.' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010299fe65 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x0000000102418deb objc_exception_throw + 48 
    2 CoreFoundation      0x000000010299f7c4 __NSFastEnumerationMutationHandler + 132 
    3 PhotoCollageCanvas     0x000000010056878f -[photoAssets collectionView:didSelectItemAtIndexPath:] + 767 
    4 UIKit        0x0000000103afb4a7 -[UICollectionView _selectItemAtIndexPath:animated:scrollPosition:notifyDelegate:] + 701 
    5 UIKit        0x0000000103b1d049 -[UICollectionView touchesEnded:withEvent:] + 574 
    6 UIKit        0x00000001034b6ef7 forwardTouchMethod + 349 
    7 UIKit        0x00000001034b6fc0 -[UIResponder touchesEnded:withEvent:] + 49 
    8 UIKit        0x00000001034b6ef7 forwardTouchMethod + 349 
    9 UIKit        0x00000001034b6fc0 -[UIResponder touchesEnded:withEvent:] + 49 
    10 UIKit        0x0000000103783ede _UIGestureRecognizerUpdate + 10279 
    11 UIKit        0x0000000103319f8a -[UIWindow _sendGesturesForEvent:] + 1137 
    12 UIKit        0x000000010331b1c0 -[UIWindow sendEvent:] + 849 
    13 UIKit        0x00000001032c9b66 -[UIApplication sendEvent:] + 263 
    14 UIKit        0x00000001032a3d97 _UIApplicationHandleEventQueue + 6844 
    15 CoreFoundation      0x00000001028cba31 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
    16 CoreFoundation      0x00000001028c195c __CFRunLoopDoSources0 + 556 
    17 CoreFoundation      0x00000001028c0e13 __CFRunLoopRun + 867 
    18 CoreFoundation      0x00000001028c0828 CFRunLoopRunSpecific + 488 
    19 GraphicsServices     0x00000001058d8ad2 GSEventRunModal + 161 
    20 UIKit        0x00000001032a9610 UIApplicationMain + 171 
    21 Photo        0x0000000100566a5f main + 111 
    22 libdyld.dylib      0x000000010697b92d start + 1 
    23 ???         0x0000000000000001 0x0 + 1 
) 
+0

Sie können nicht '[arrFinalStore removeObject: img];' stattdessen neue Array erstellen und bearbeiten –

Antwort

3

Was denken Sie, dass das Schloss tun würde? Es tut genau nichts. Du hast ein Schloss erstellt, es gesperrt und es entsperrt. Da dieser Code der einzige Code mit Zugriff auf das Schloss ist, kann das Schloss niemand davon abhalten, irgendetwas zu tun.

Und es würde Ihr Problem sowieso nicht lösen. Jemand zählt dieses Array auf. Alle versuchen, es zu ändern, wie Sie versuchen, während es aufgezählt ist, wird abstürzen.

Ihr Code ist (mit Linien entfernt)

for(id img in arrFinalStore) 
    { 
     [arrFinalStore removeObject:img]; 
    } 

Dieser Code unbedingt zum Absturz bringen wird, und es gibt nichts, was es vor einem Absturz zu stoppen. Sie können ein Objekt während der Iteration nicht aus einem Array entfernen.

+0

@ gnasher728 bro i crash Grund gesucht und gelesen ii aufgrund einzufädeln, passieren wird den Faden der entsandte diesen Code zu stoppen, so das habe ich benutzt, also hast du gesagt, ich liege falsch, wie ich das überwinden kann. –

+0

ok bro danke .... –

1

Sie Element nicht entfernen können, während sie durch Array iterieren

  [arrFinalStore removeObject:img]; 

nur [arrFinalStore removeObject:img] verwenden;

0

Es ist nicht das Problem mit dem Schloss. Aber das Problem ist, während des Iterierens versuchen Sie, das Element zu entfernen, was bedeutet, dass Sie eine gleichzeitige Änderung durchführen, die eine Ausnahme auslöst.

hier ist ein Beispiel, das Sie

for (item in originalArrayOfItems) { 
if ([item shouldBeDiscarded]) 
    [discardedItems addObject:item];} 

[originalArrayOfItems removeObjectsInArray: discardedItems] verwenden können;

0

Sie können nicht Element entfernen, während sie durch Array iteriert, so können Sie temporäre Array mit allen unnötigen Objekte erstellen und dann - (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray

So Ihr Code nennen ist:

NSMutableArray *tempArray = [NSMutableArray array]; 
for(id img in arrFinalStore) 
{ 
    if(img==getimg) 
    { 
     [tempArray addObject:img]; 
    } 
} 
[arrFinalStore removeObjectsInArray:tempArray]; 

können Sie auch einfach for (int i = arrfinalstoer.count - 1; i > 0; --i) verwenden für Aufzählung.