1

MKMapView / 注釈 / UINavigationController に問題があります。基本的に、私は UINavigationController を使用してビューを管理します。ビューの 1 つに MKMapView が含まれており、addAnnotations メソッドを使用して注釈 (10 から 200) を追加します。

UINavigationController で「速すぎる」とナビゲートすると、iPhone シミュレーターがクラッシュし、「EXC BAD ACCESS」信号を受信します。たとえば、MKMapView を含むビューを読み込んで、すぐに UINavigationController ナビゲーション バーの [戻る] ボタンを押すと、シグナルが表示されます。問題は addAnnotations メソッドにあると考えました。 MKMapView が読み込まれると、それに注釈を追加しますが、すべてが非同期で行われるようです。「戻る」ボタンを押す前に1秒ほど待ってもエラーは発生しませんが、速すぎるとクラッシュします。addAnnotations 行を削除しても、エラーはまったく発生しません。addAnnotations メソッドが作業を完了する前に、私のビューが UINavigationController によって解放されたためだと思います。

これに対する良い解決策はありますか?ユーザーを待たせたくありません (たとえば、読み込み中のビューを表示するなど)。解決策はより良いメモリ管理かもしれないと思いますが、これを行う方法がわかりません。

    if(DEBUG_MODE) { NSLog(@"Creating array of placemarks : begin"); }
self.placemarkCache = [[NSMutableArray alloc] init];
// Loading placemarks for a placemark dictionary
NSArray *sortedKeys = [[self.placemarkDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
for (id key in sortedKeys) {
    MyPlacemark *currentPlacemark = [self.placemarkDictionary objectForKey:key];
    [self.placemarkCache addObject:currentPlacemark];
    [currentPlacemark release];
}
if(DEBUG_MODE) { NSLog(@"Creating array of placemarks : done"); }
if(DEBUG_MODE) { NSLog(@"Adding placemarks : begin"); }
[self.mapView addAnnotations:self.placemarkCache];
if(DEBUG_MODE) { NSLog(@"Adding placemarks : done"); }

この例では、マップに何かが表示される前に「目印を追加しています: 完了」というメッセージが表示されます。

4

1 に答える 1

5

同じ問題またはバグに遭遇し、ブログ投稿で解決策を見つけました。

デバッガーのスタック トレースを見ると、投稿の問題と同じかどうかを確認できます。

この問題は、MapViewController (MKMapView の親) の割り当てが解除され、MKMapView の非同期マップ フェッチ内部が MKMapView (MapViewController) のデリゲートを呼び出そうとしているためです。

したがって、MapViewController の dealloc では、MKMapView.delegate = nil をリセットして、いくつかのタイルが返された後にデリゲートが呼び出されないようにする必要があります。

更新: デリゲート ホルダーを解放する前に、dealloc でデリゲートを nil にすることをお勧めします (メモリ管理ドキュメントのどこかにあります)。これにより、長時間実行される非同期タスクでこのような問題が発生するのを防ぐことができます。

于 2009-09-07T16:35:33.677 に答える