Kishore Kumar
Kishore Kumar

Reputation: 4375

Even though after lock the threads get crashed <__NSArrayM: 0x7f881a6b1900> was mutated while being enumerated?

This my code ,i am removing multiple values on my condition

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

I am understood something goes wrong trying to find out this error ,please help me to overcome this .

This is error :

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

Upvotes: 0

Views: 75

Answers (4)

NittinS
NittinS

Reputation: 53

Its not the issue with the lock. But the issue is while iterating you are trying to remove the element which means you doing concurrent modification which throws exception.

here is an example you can use

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

[originalArrayOfItems removeObjectsInArray:discardedItems];

Upvotes: 0

Vidrilla
Vidrilla

Reputation: 51

You cannot remove element while iterating through array, so you can create temp array with all unnecessary objects and then call - (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray

So your code is:

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

also you can use simple for (int i = arrfinalstoer.count - 1; i > 0; --i) for enumeration.

Upvotes: 0

gnasher729
gnasher729

Reputation: 52592

What do you think that lock would do? It does exactly nothing. You created a lock, locked it, unlocked it. Since that code is the only code with access to the lock, that lock cannot possibly prevent anyone from doing anything.

And it wouldn't solve your problem anyway. Someone is enumerating that array. Any attempt to modify it, as you are trying, while it is enumerated, will crash.

Your code is (with lines removed)

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

That code is absolutely going to crash, and there is nothing that can stop it from crashing. You cannot remove an object from an array while iteration.

Upvotes: 3

Saqib Saud
Saqib Saud

Reputation: 2795

You cannot remove element while iterating through array

            [arrFinalStore removeObject:img];

just use [arrFinalStore removeObject:img];

Upvotes: 1

Related Questions