Странные сбои иногда являются признаком повреждения памяти и / или неправильного управления. Я только что нашел и исправил труднодоступную ошибку в одном из моих приложений несколько дней назад. Приложение работало безупречно в течение 6 месяцев на iOS 3.2, но мгновенно зависало на iOS 4.2. Сбой происходил при добавлении основного окна в окно во время запуска applicationDidFinishLaunching. Трассировка стека показала 100% код iOS; там нигде не было ни одной моей функции (кроме applicationDidFinishLaunching). Оказалось, что я переиздавал UIImage в коде, который был вызван ранее, пока загружались представления. (Я ошибочно вызывал релиз на автоматически выпущенном UIImage).
Я не видел конкретной аварии, которую вы видите, но вот несколько вещей, которые вы можете попробовать, которые могут пролить свет:
(1) Запустите приложение с помощью NSZombieEnabled. Это переменная окружения, которую вы устанавливаете с помощью XCode, которая часто идентифицирует места, где вы можете ссылаться на объекты, которые уже были освобождены (например, как пример избыточного выпуска, который я упоминал ранее). Дополнительные подробности здесь:
http://www.cocoadev.com/index.pl?NSZombieEnabled
(2) Вы можете включить ведение журнала, в котором будут регистрироваться все сообщения, отправленные всем объектам. Журнал записывается в текстовый файл в папке TMP. Если вы изучите файл журнала, приведший к сбою, вы можете получить некоторое представление о том, что происходит прямо перед сбоем. Это на самом деле техника, которую я использовал, чтобы решить мою ошибку. Вы можете либо изменить свой код, чтобы включить / отключить ведение журнала:
instrumentObjcMessageSends(YES);
// Do stuff...
instrumentObjcMessageSends(NO);
Или вы можете вызвать функцию напрямую из отладчика. Например, установите точку останова непосредственно перед сбоем, затем перейдите в консоль отладчика и сделайте следующее:
(gdb) call (void)instrumentObjcMessageSends(YES)
Дополнительные подробности здесь:
http://www.dribin.org/dave/blog/archives/2006/04/22/tracing_objc/