У меня есть контроллер представления, управляемый в UINavigationController. Мой контроллер представления выводит экран «загрузки» и использует ASIHTTP для асинхронной загрузки данных таблицы. Затем он отображает свою таблицу, и в каждой ячейке есть изображение, которое он использует ASIHTTP для асинхронной загрузки. При загрузке каждого изображения он использует [self.tableView reloadRowsAtIndexPaths]
для перезагрузки этой строки, внутри которой изображение подается в UIImageView в каждой строке.
Отлично работает. Но если я выхожу из поля зрения до того, как загрузка закончится, он вылетает.
Где происходит сбой, это мой -tableView:numberOfRowsInSection
метод, и NSZombies говорит мне, что он умирает, потому что он запрашивает -count
NSArray с именем self.offers
, который был освобожден.
Этот метод выглядит так:
-(NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
return [self.offers count];
}
Обтекание этого возврата в if (self.offers)
не имело значения.
My -dealloc
освобождает и устанавливает нулевое значение для каждого из этих свойств, включая как self.offers, так и сам self.tableView. Я даже пытался установить свойство BOOL disappearing
, нажав YES в -viewWillDisappear
, и отключить условное поведение, но это не работает, потому что viewWillDisappear, кажется, не вызывается! Насколько я могу судить, мы не вызываем ЛЮБОГО метода, когда навигационная панель выводит нас из строя.
Что мне с этим делать?
EDIT:
Благодаря @cduhn (который гонится за чеком!), Я сделал еще кучу, глядя на это. Проблема в том, что мой -dealloc
просто не вызывается, когда я запускаю этот viewcontroller (ни мои -viewWillDisappear
, ни -viewDidUnload
или что-либо еще, что я мог бы использовать, чтобы отцепить структуру делегирования, которая является корнем этой проблемы).
Тогда я понял: этот viewController не тот, что в стеке NavController! На вершине стека находится представление оболочки, просто сегментированный контроллер и большой пустой UIView. Я переключаю содержимое этого UIView между двумя другими подклассами UIViewController в зависимости от состояния моего сегментированного контроллера. Поэтому, когда мое представление с таблицей в виде PARENT выскользнуло из стека навигации, этот РЕБЕНОК, над которым я работаю, похоже, не получил никакого уведомления об этом. Что странно, потому что я определенно release
это делаю.
Я могу вызвать его -dealloc с моего контроллера оболочки. Я мог бы назвать его -viewWillDisappear тоже, в этом отношении. Это то, как я должен справиться с этим? Вероятно, я должен поместить что-то в представление моего контроллера оболочки, как:
[[self.mainView subviews] makeObjectsPerformSelector: @selector (viewWillDisappear)];
... чтобы сообщение распространялось на мои дочерние представления.
Думаю, я на правильном пути?
(О, боже ... и это также объясняет, почему действия из этого дочернего табличного представления не могут добраться до self.navigationController
! Я недоумевал об этом в течение нескольких недель!)