7

NavigationController のために、プッシュされる ViewController (MKMapView を使用) があります。したがって、「戻る」ボタンのある NavBar があります。その戻るボタンをクリックすると、エラーが発生します。

2010-01-11 18:05:35.273 TestApp[147:207] クラス MKUserLocation のインスタンス 0x1758f0 の割り当てが解除されていますが、キー値オブザーバーがまだ登録されています。観測情報が漏洩しており、誤って他の天体にくっついてしまう可能性さえあります。NSKVODeallocateBreak にブレークポイントを設定して、デバッガーでここで停止します。現在の観測情報は次のとおりです: (コンテキスト: 0x0、プロパティ: 0x17d600>) プログラムは信号を受信しました: 「EXC_BAD_ACCESS」。

Observer で実装された viewDidLoad メソッドがあります。

- (void)viewDidLoad {
    mapView = (MKMapView*)self.view;
    mapView.delegate = self;
    mapView.mapType = MKMapTypeHybrid;
    mapView.showsUserLocation = YES;

    // ...

    [mapView.userLocation addObserver:self forKeyPath:@"location" options:0 context:NULL];
    [super viewDidLoad];

}

私の解放:

- (void)dealloc {
    [groupId release];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

ここで何が問題なのか誰か教えてもらえますか? NavBar の [戻る] ボタンをクリックすると、dealloc メソッドに入り、上位の ViewController に戻り、このエラーがスローされます。

よろしくお願いします。

4

1 に答える 1

12

さまざまなオブジェクトでオブザーバーを設定および削除しています。最初のコード サンプルでビュー コントローラーを userLocation のオブザーバーとして追加し、2 番目のコード サンプルでそれをデフォルトの通知センターから削除しようとしています。オブザーバーを userLocation から適切に削除するには、 -dealloc メソッドを次のように変更します。

- (void)dealloc {
    [groupId release];
    [mapView.userLocation removeObserver:self forKeyPath:@"location"];
    [super dealloc];
}
于 2010-01-11T17:47:05.013 に答える