Reputation: 4375
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
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
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
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
Reputation: 2795
You cannot remove element while iterating through array
[arrFinalStore removeObject:img];
just use [arrFinalStore removeObject:img]
;
Upvotes: 1