我不知所措!这是只在特定条件下发生的那些讨厌的错误之一,但我无法直接将条件和结果联系起来。
我的应用程序有一个分页的 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 是一个包含 MyViewController 类型对象的 NSMutableArray。MyViewController 没有自定义属性,它的 dealloc 方法只包含一个 [super dealloc] 调用。
这是调试器显示的内容: alt text http://a.imageshack.us/img831/3610/screenshot20100806at126.png
问题是每次清除控制器时都不会发生这种情况,而只是有时会发生。具体来说,在某些更改触发完全清理和重新绘制 ScrollView 之后,它会很好地显示当前页面(称为 X),但是一旦我滚动到足以导致清理 X 的位置,就会发生这种崩溃。快把我逼疯了!
另一件事,这不会发生在 4.0 模拟器中,也不会发生在 iPad 上,但在运行 3.1.3 的第一代 iPod touch 上会非常一致地发生。