Некоторые мысли здесь.
Сначала вы используете @ try / @ catch.Я считаю, что NSKeyedArchiver
генерирует исключения, когда на самом деле должен возвращать NSError
объекты.Так что, возможно, именно поэтому вы делаете это.Но вы должны иметь в виду, что none фреймворков Apple гарантированно будут исключительными .Это означает, что перехват исключений может привести к тому, что код Apple (и, конечно, ваш собственный) окажется в несогласованных состояниях, что помешает его правильной работе в будущем.
Я бы настоятельно рекомендовал либо удалить @catch, либо ограничить область действия.он чрезвычайно тесно связан с кодом NSKeyedArchiver
, если вы поэтому его используете.Это может привести к непреднамеренному введению множества других ошибок в ваше приложение.
Теперь перейдем к конкретному сбою.Это происходит в коде управления памятью среды выполнения.Это очень сильно указывает на коррупцию в куче.Это означает, что у вас есть указатель, который не указывает на действительный объект Objective C в памяти.Это может произойти по многим причинам, и это чрезвычайно распространено.Наиболее распространенная причина известна как висячий указатель.Однако это также может быть вызвано чрезмерным выпуском.И я совсем не удивлюсь, если можно использовать @catch для запуска перевыпуска.(Я знаю, я плохо говорю, но я видел , поэтому много проблем, вызванных этим шаблоном)
Что я обычно рекомендую в этих ситуациях:
- Найдите другие сбои, связанные с повреждением кучи
- Попробуйте
Zombies
в инструментах - Попробуйте malloc scribble или guardmalloc, два других хороших инструмента отладки памяти
Трудно, а часто даже невозможно, рассуждать о кучной коррупции.Воспроизведение ошибки также может быть невозможным, поскольку повреждение памяти, как правило, не является детерминированным.
Итак, просто попытайтесь найти и исправить столько проблем, сколько сможете.Вполне возможно, что один из них ответственен за множество аварий, одним из которых может быть этот.