Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x3427eb30 _class_isInitialized
1 libobjc.A.dylib 0x3427e8d6 _class_initialize
2 libobjc.A.dylib 0x3427e88e prepareForMethodLookup
3 libobjc.A.dylib 0x3427e76a lookUpMethod
4 libobjc.A.dylib 0x3427e008 objc_msgSend_uncached
5 CoreFoundation 0x33f7c020 CFRetain
6 CoreFoundation 0x33f85bac +[__NSArrayI __new::]
7 CoreFoundation 0x33f85ac6 -[__NSPlaceholderArray initWithObjects:count:]
Этот сбой является признаком чрезмерного выпуска или повреждения.В частности, один из ключей в вашем словаре был переиздан и / или поврежден.В частности, указатель isa
теперь указывает на мусор.
Когда allKeys
пытается создать временный массив всех ключей, он пытается сохранить поврежденный объект (через CFRetain
, но обрабатывает егокак звонок на retain
).Среда выполнения не распознает указатель isa
как инициализированный класс (потому что он указывает на мусор) и пытается вызвать initialize
для этого «класса», что приводит к падению.
ТеперьБывает, что поврежденный isa
, скорее всего, является значением, которое указывает на читабельное, но мусор, меню и приводит к падению на несколько уровней глубоко во время выполнения.Чаще всего это происходит потому, что объект был перевыпущен, а затем какая-то структура оказалась malloc () 'd в том же месте, и эта структура имеет указатель в качестве первой записи, что является полностью распространенным шаблоном для структур.
Чтобы исправить?
Сначала запустите анализатор и исправьте все проблемы, к которым он предъявляет жалобы.
Затем проверьте все случаи использования объектов, которые являются ключами в этом словаре.Посмотрите, сможете ли вы найти, где может произойти перепроизводство.
Наконец, попробуйте включить зомби и посмотреть, сможете ли вы воспроизвести аварию.