Приложение iPhone падает, когда пользователь выходит из UITableView с MBProgressHUD, работающим в отдельном потоке - PullRequest
4 голосов
/ 22 марта 2011

В моем приложении у меня есть UITableViewController, который загружает вычисленные данные из моего основного хранилища данных. Это может занять некоторое время и привести к зависанию основного потока, поэтому для обеспечения визуальной обратной связи с пользователем я установил виджет MBProgressHUD, который будет отображать индикатор прогресса (просто вращающееся колесо), а метод расчета выполняется в отдельном потоке.

Это нормально, за исключением того, что пользователь все еще может выйти из UITableViewController, если он считает, что это занимает слишком много времени. Конечно, это хорошо, за исключением того, что когда отдельный поток завершает свою работу, он все еще пытается вызвать свой делегат (UITableViewController), чтобы скрыть MBProgressHUD. Это вызывает сбой, потому что, поскольку пользователь уже вышел из UITableViewController, у него есть dealloc 'd и release' d.

MBProgressHUD имеет следующий код, чтобы попытаться остановить это:

if(delegate != nil && [delegate conformsToProtocol:@protocol(MBProgressHUDDelegate)]) {
    if([delegate respondsToSelector:@selector(hudWasHidden)]) {
        [delegate performSelector:@selector(hudWasHidden)];
    }
}

Однако мое приложение почему-то по-прежнему работает с этим внутренним кодом ([delegate performSelector:@selector(hudWasHidden)]), даже если UITableViewController полностью отсутствует, что приводит к сбою приложения.

Есть предложения? Я не бегу с NSZombiesEnabled.

Ответы [ 2 ]

4 голосов
/ 23 марта 2011

В вашем UITableViewController методах viewWillDisappear, viewDidDisappear или dealloc установите MBProgressHUD.delegate = nil;

0 голосов
/ 23 марта 2011

Как только пользователь вышел из контроллера таблицы, свойство делегата hud указывает на освобожденный объект (= зона памяти, которая может содержать все, что угодно). Это вызывает сбой, когда вычислительный поток заканчивается и пытается отправить любое сообщение делегату.

В контроллере табличного представления dealloc необходимо установить делегат hud на nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...