У меня сейчас похожая проблема в моем приложении. Контроллер представления, который отображает UIWebView, передается на контроллер навигации и запускает фоновый поток для извлечения данных. Если вы нажмете кнопку «Назад» до завершения потока, приложение завершит работу с тем же сообщением об ошибке.
Проблема, похоже, в том, что NSThread
сохраняет цель (себя) и объект (аргумент) и освобождает их после запуска метода - к сожалению, он освобождает оба из потока. Поэтому, когда контроллер создается, счет сохранения равен 1, при запуске потока контроллер получает счет сохранения 2. Когда вы выталкиваете контроллер до завершения потока, контроллер навигации освобождает контроллер, что приводит к сохранить количество 1. Пока это нормально - но если поток, наконец, завершается, NSThread
освобождает контроллер, что приводит к сохранению счетчика 0 и немедленному освобождению изнутри потока. Это приводит к тому, что UIWebView (который выпускается в методе dealloc контроллера) вызывает это предупреждение об ошибке потока и вылетает.
Я успешно обошел эту проблему, используя [[self retain] autorelease]
в качестве последнего оператора в потоке (непосредственно перед тем, как поток освободит свой пул). Это гарантирует, что объект контроллера не освобождается сразу, а помечается как автоматически освобожденный и освобождается позже в цикле выполнения основного потока. Однако это довольно грязный хак, и я бы предпочел найти лучшее решение.