7

由于 NavigationController,我有一个被推入的 ViewController(带有 MKMapView)。所以我有一个带有“后退”按钮的导航栏。单击该后退按钮,我收到一个错误:

2010-01-11 18:05:35.273 TestApp[147:207] MKUserLocation 类的实例 0x1758f0 正在被释放,而键值观察者仍向其注册。观察信息被泄露,甚至可能被错误地附加到其他对象上。在 NSKVODeallocateBreak 上设置断点以在调试器中停止。这是当前观察信息:(上下文:0x0,属性:0x17d600>)程序接收信号:“EXC_BAD_ACCESS”。

我用观察者实现了 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 的观察者,然后尝试将其从第二个代码示例中的默认通知中心删除。要从 userLocation 中正确删除观察者,请将您的 -dealloc 方法更改为以下内容:

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