Я в растерянности! Это одна из тех неприятных ошибок, которые случаются только при определенных условиях, но я не могу напрямую связать условия и результаты.
Мое приложение имеет постраничный UIScrollView, где представление каждой страницы происходит из MyViewController, подкласса UITableViewController. Чтобы минимизировать использование памяти, я выгружаю те контроллеры, которые в данный момент не видны. Вот мой метод «очистки»:
- (void) cleanViewControllers:(BOOL)all {
if (all) {
// called if some major changes occurred and ALL controllers need to be cleared
for (NSInteger i = 0; i < [viewControllers count]; i++)
[viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
}
else if ([viewControllers count] > 2) {
// called if only the nearest, no longer visible controller need to be cleared
NSInteger i = pageControl.currentPage - 2;
if (i > -1) [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
i = pageControl.currentPage + 2;
if (i < [viewControllers count]) [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
}
}
Эта строка вызывает сбой приложения:
viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
viewControllers - это NSMutableArray, содержащий объекты типа MyViewController. MyViewController не имеет пользовательских свойств, а его метод dealloc не содержит ничего, кроме вызова [super dealloc].
Вот что показывает отладчик:
альтернативный текст http://a.imageshack.us/img831/3610/screenshot20100806at126.png
Дело в том, что это происходит не каждый раз, когда контроллер очищается, а только иногда. В частности, после того, как определенные изменения инициируют полную очистку и перерисовку ScrollView, он отображает текущую страницу (назовите ее X) в порядке, но как только я прокручиваю достаточно далеко, чтобы вызвать очистку X, происходит сбой. Это сводит меня с ума!
Другое дело, что это не происходит ни в симуляторе 4.0, ни на iPad, но происходит очень стабильно на iPod touch 1-го поколения с 3.1.3.