iPhone-类的实例。。。正在解除分配,但仍向其注册键值
我有一个ViewController(带有MKMapView),由于NavigationController,它被推入。所以我有一个带“后退”按钮的导航栏。 单击“后退”按钮,我得到一个错误: 2010-01-11 18:05:35.273 TestApp[147:207]正在释放MKUserLocation类的实例0x1758f0,而键值观察者仍在该实例中注册。观测信息正在被泄露,甚至可能被错误地附加到其他对象上。在NSKVODeallocateBreak上设置断点,使其在调试器中停止。以下是当前的观察信息: ( 上下文:0x0,属性:0x17d600> ) 程序收到信号:“EXC\U坏访问” 我使用观察者实现了viewDidLoad方法:iPhone-类的实例。。。正在解除分配,但仍向其注册键值,iphone,uinavigationcontroller,observer-pattern,key-value-observing,Iphone,Uinavigationcontroller,Observer Pattern,Key Value Observing,我有一个ViewController(带有MKMapView),由于NavigationController,它被推入。所以我有一个带“后退”按钮的导航栏。 单击“后退”按钮,我得到一个错误: 2010-01-11 18:05:35.273 TestApp[147:207]正在释放MKUserLocation类的实例0x1758f0,而键值观察者仍在该实例中注册。观测信息正在被泄露,甚至可能被错误地附加到其他对象上。在NSKVODeallocateBreak上设置断点,使其在调试器中停止。以下是
- (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];
}
我的dealloc:
- (void)dealloc {
[groupId release];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
谁能告诉我这里怎么了?我单击导航栏中的后退按钮,然后进入dealloc方法,然后它切换回更高的ViewController并抛出此错误
非常感谢您的问候。您正在设置和删除不同对象上的观察者。在第一个代码示例中将视图控制器添加为userLocation的观察者,然后在第二个代码示例中尝试将其从默认通知中心中删除。要从userLocation中正确删除观察者,请将-dealloc方法更改为以下方法:
- (void)dealloc {
[groupId release];
[mapView.userLocation removeObserver:self forKeyPath:@"location"];
[super dealloc];
}
更具体地说,您结合了两种不同的通知模型:NSNotifications和KVO。(尽管布拉德的解决方案是正确的!)