iPhone - 正在释放类的一个实例,而键值观察仍在其中注册

Tim*_*Tim 7 iphone key-value-observing uinavigationcontroller observer-pattern

由于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];
Run Code Online (Sandbox Code Playgroud)

}

我的dealloc:

- (void)dealloc {
    [groupId release];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这里有什么问题?我单击NavBar中的后退按钮然后我进入dealloc方法,然后它切换回更高的ViewController并抛出此错误.

非常感谢提前和最诚挚的问候.

Bra*_*son 12

您正在设置和删除不同对象上的观察者.您将视图控制器添加为第一个代码示例中userLocation的观察者,然后尝试将其从第二个默认通知中心中删除.要从userLocation中正确删除观察者,请将-dealloc方法更改为以下内容:

- (void)dealloc {
    [groupId release];
    [mapView.userLocation removeObserver:self forKeyPath:@"location"];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)