Проблема, которую вы описываете, может быть одной из нескольких вещей;возможно, вы чрезмерно выпускаете объект или вы повреждаете память.Если вы повредите память - в частности, первые несколько байтов объекта - тогда это может легко проявиться как сбой во время очистки пула автоматического выпуска (или любого другого сообщения).
То, что сбой происходит наУстройство, но не симулятор, также указывает на повреждение памяти.Архитектура устройства [ARM] и симулятора [i386] совершенно иная, и существует ряд проблем, которые могут возникнуть.
Как правило, он не проявляет себя так последовательно.
Сначала опубликуйте обратный след аварии.Это может помочь.
Во-вторых, вы делаете какие-либо необработанные malloc
звонки?Или заполнение буферов данными?Самая частая причина таких сбоев - запуск за пределами буфера.
#0 0x31ac8bc8 in _cache_fill ()
#1 0x31acaf8e in lookUpMethod ()
#2 0x31ac8780 in _class_lookupMethodAndLoadCache ()
#3 0x31ac859a in objc_msgSendSuper_uncached ()
#4 0x328014f0 in -[__NSArrayReverseEnumerator dealloc] ()
(Выше было добавлено после того, как OP исправил проблему, но - для архива)
Эта трассировка аварии является классической сигнатурой повреждения памяти.А именно, указатель isa
- значение байта первого указателя в объекте, который указывает на класс экземпляра - был растоптан.Обычно это происходит, когда вы переполняете буфер памяти при выделении перед объектом.Если это просто переполнение пары байтов, то поведение между разными платформами может отличаться, так как кванты malloc - реальный размер выделений (вы запрашиваете 90 байтов на одной платформе, и вы можете получить 96. Другая? 128) -- различаются между платформами и даже выпусками.
В частности, isa был растоптан со значением, которое выглядело достаточно как указатель, чтобы среда выполнения разыменовывала значение мусора, а затем пыталась обработать полученное местоположение как класс.таблица методов.
Каждый раз, когда вы видите сбой в нескольких кадрах глубоко в одной из objc_msgSend*()
функций, вполне вероятно повреждение памяти и, если так, почти всегда будет переполнение буфера.
Так как это легко сделать, все же хорошей идеей будет сделать тестовый проход с обнаружением зомби, чтобы уловить «иногда это просто перевыпуск».