私は途方に暮れています!特定の条件下でのみ発生する厄介なバグの 1 つですが、条件と結果を直接関連付けることはできません。
私のアプリにはページ化された UIScrollView があり、各ページのビューは UITableViewController のサブクラスである MyViewController から取得されます。メモリ使用量を最小限に抑えるために、現在表示されていないコントローラーをアンロードします。これが私の「クリーニング」方法です。
- (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] 呼び出ししか含まれていません。
デバッガーが表示するものは次のとおりです。 代替テキスト http://a.imageshack.us/img831/3610/screenshot20100806at126.png
問題は、コントローラーがクリアされるたびにこれが発生するわけではなく、時々発生することです。具体的には、特定の変更により ScrollView の完全なクリーニングと再描画がトリガーされた後、現在のページ (X と呼びます) が正常に表示されますが、X をクリーニングするのに十分な距離までスクロールするとすぐに、このクラッシュが発生します。それは私を夢中にさせています!
また、これは 4.0 シミュレーターや iPad では発生しませんが、3.1.3 を実行している第 1 世代の iPod touch では一貫して発生します。