Завершение работы приложения из-за - неперехваченного исключения 'NSGenericException',

Я получил ошибку ниже при извлечении некоторых данных с сервера. При получении данных я показываю настраиваемое представление предупреждений с индикатором активности. Оповещение использует основной поток, в то время как выборка данных выполняется NSThread. Эта проблема возникает не всегда, а только время от времени. Я не понимаю, что мне делать.

* Завершение работы приложения из-за неперехваченного исключения 'NSGenericException', причина: '* Коллекция была изменена при перечислении. ("", "", "")'

* Стек вызовов при первом вызове: (

0   CoreFoundation                      0x00f2abe9 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x0107f5c2 objc_exception_throw + 47
2   CoreFoundation                      0x00f2a6a9 __NSFastEnumerationMutationHandler + 377
3   UIKit                               0x00371b8e -[UIView(Hierarchy) _findFirstSubviewWantingToBecomeFirstResponder] + 189
4   UIKit                               0x00366a13 -[UIView(Hierarchy) _promoteDescendantToFirstResponderIfNecessary] + 42
5   MyApplnName                        0x00015154 -[SecondViewController getDataFromServer] + 1798
6   Foundation                          0x000a1d4c -[NSThread main] + 81
7   Foundation                          0x000a1cd8 __NSThread__main__ + 1387
8   libSystem.B.dylib                   0x928db7fd _pthread_start + 345
9   libSystem.B.dylib                   0x928db682 thread_start + 34

)

terminate вызывается после выброса экземпляра 'NSException'


person JiteshW    schedule 24.10.2011    source источник
comment
Я не эксперт по объективному C, но, глядя на сообщение об ошибке, я хочу спросить: вы делаете в своем коде что-то вроде foreach item in collection и одновременно изменяете коллекцию в теле цикла?   -  person Ankur    schedule 24.10.2011


Ответы (1)


Проблема заключается в части вашего кода, где вы перечисляете некоторые object, например, NSMutableArray или NSMutableSet, используя for-loop (for (id _obj in object)) и в этом цикле удаляя или добавляя некоторые объекты к тому же object. Это не возможно и вызывает exception.

Вы можете заменить этот цикл for на цикл for, используя индексную переменную:

 for (int i=0; i<[object count]; i++)
 {
    //add or remove objects if you want
 } 
person Nekto    schedule 24.10.2011
comment
Нет, я не удаляю объекты из цикла for. На самом деле я делаю следующее: 1. Я создаю один объект в цикле for 2. Если он не равен Nil, то добавляю его в один словарь, а затем добавляю этот объект в массив. - person JiteshW; 24.10.2011
comment
Вы читаете мой пост? ›Этот цикл удаляет или добавляет некоторые объекты - person Nekto; 24.10.2011
comment
Извините за сообщение выше. Я понял это, я изменил свой код и теперь он работает. - person JiteshW; 24.10.2011