熊双全
熊双全

Reputation: 41

Collection <__NSArrayM> was mutated while being enumerated.'

Application Specific Information:
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x17204b070> was mutated while being enumerated.'
Last Exception Backtrace:
0   CoreFoundation                      0x0000000186acefe0 __exceptionPreprocess + 124
1   libobjc.A.dylib                     0x0000000185530538 objc_exception_throw + 56
2   CoreFoundation                      0x0000000186acea30 __NSFastEnumerationMutationHandler + 128
3   UIKit                               0x000000018cc22f04 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) clearGestureRecognizers:] + 220
4   UIKit                               0x000000018cc22d78 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setGestureRecognizers] + 88
5   UIKit                               0x000000018d1d1d38 -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 64
6   UIKit                               0x000000018d1d556c _UIGestureRecognizerSendTargetActions + 124
7   UIKit                               0x000000018cd8f470 _UIGestureRecognizerSendActions + 252
8   UIKit                               0x000000018cc31380 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 720
9   UIKit                               0x000000018d1c5810 _UIGestureEnvironmentUpdate + 988
10  UIKit                               0x000000018d1c53e0 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 404
11  UIKit                               0x000000018d1c468c -[UIGestureEnvironment _updateGesturesForEvent:window:] + 268
12  UIKit                               0x000000018cc2f70c -[UIWindow sendEvent:] + 3164
13  UIKit                               0x000000018cc0033c -[UIApplication sendEvent:] + 340
14  UIKit                               0x000000018d3fa014 __dispatchPreprocessedEventFromEventQueue + 2400
15  UIKit                               0x000000018d3f4770 __handleEventQueue + 4268
16  UIKit                               0x000000018d3f4b9c __handleHIDEventFetcherDrain + 148
17  CoreFoundation                      0x0000000186a7d42c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
18  CoreFoundation                      0x0000000186a7cd9c __CFRunLoopDoSources0 + 540
19  CoreFoundation                      0x0000000186a7a9a8 __CFRunLoopRun + 744
20  CoreFoundation                      0x00000001869aada4 CFRunLoopRunSpecific + 424
21  GraphicsServices                    0x0000000188414074 GSEventRunModal + 100
22  UIKit                               0x000000018cc65058 UIApplicationMain + 208
23  MyApp                            0x000000010001d0ac main (main.m:16)
24  libdyld.dylib                       0x00000001859b959c start + 4

Upvotes: 4

Views: 6022

Answers (2)

Krunal
Krunal

Reputation: 79646

There are following possible reasons for this error:

1st Reason

You may be trying to update or remove elements from an array using (inside) For Each Loop.

  • Don't update or remove element inside For Each Loop.

  • Use normal for loop, if you wan't data manipulation operation with your array, like:

    int i
    for (i=0; i < array.count; i++) {
       // update or remove operation
    }
    

2nd Reason

You are trying to modify (update or delete) element from non-mutable array. Your error message indicates, you are using Objective-C programming language.

In objective-C, there are two kinds of collections: Mutable and non-mutable.

  • NSArray is non-mutable type of collection while,
  • NSMutableArray is mutable type of collection

Use NSMutableArray to perform data manipulation (update or remove elements) operations with an array.

Upvotes: 7

Bruce Lee
Bruce Lee

Reputation: 4431

Sometimes, this happens in multi-thread situation. When a thread is reading an array, the other thread is trying to modify it.

In react-native component I have a native UI component, and a method in it. I did not specify which thread the method will run. So this problem happens. After I add this code, everything works find.

- (dispatch_queue_t)methodQueue {
  return dispatch_get_main_queue();
}

Upvotes: 0

Related Questions