2016-05-05 9 views
0

この私のコードは、私がロックした後でも、スレッドは列挙されている間に突然変異しましたか?<__ NSArrayM:0x7f881a6b1900>

-(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]; 
} 

私は理解しています何かが、このエラーを見つけるためにしようと間違って行く私の条件に複数の値を削除しています、これを克服するために私を助けてください。

これはエラーです:

*** 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

することはできません '[arrFinalStore REMOVEOBJECT:IMG];' は、代わりに新しい配列を作成し、私はクラッシュの理由を検索 –

答えて

3

ロックではどうなると思いますか?それはまさに何もないです。あなたはロックを作成し、ロックし、ロックを解除しました。そのコードはロックにアクセスできる唯一のコードなので、ロックはおそらくが何もしないようにすることはできません。

とにかく問題は解決しません。誰かがその配列を列挙しています。 これを変更しようとすると、試行中に列挙されている間にクラッシュします。

あなたのコードは、このコードは絶対にクラッシュするつもりです

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

(削除された行で)で、クラッシュからそれを止めることは何もありません。繰り返し中に配列からオブジェクトを削除することはできません。

+0

仲間gnasher728 @編集ので、このコードを掲載IIは、スレッドを停止するには、スレッドに起因する起こります読んで私はこれを克服する方法が間違っていると言いました。 –

+0

ok bro thanks .... –

1

配列

  [arrFinalStore removeObject:img]; 

を反復するだけ[arrFinalStore removeObject:img]を使用しているときは、要素を削除することはできません。

0

ロックに関する問題ではありません。しかし、問題は、あなたが例外をスローする同時変更を行うことを意味する要素を削除しようとしている間に反復している間です。ここ

は、あなたが使用できる例です

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

[originalArrayOfItems removeObjectsInArray:discardedItems];

0

配列を反復しながら、あなたはすべての不要なオブジェクトを一時配列を作成し、だからあなたのコードがある- (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray

を呼び出すことができるようにするには、要素を削除することはできません。

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

もあなたのために簡単なfor (int i = arrfinalstoer.count - 1; i > 0; --i)を使用することができます列挙。

関連する問題