Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-类的实例。。。正在解除分配,但仍向其注册键值_Iphone_Uinavigationcontroller_Observer Pattern_Key Value Observing - Fatal编程技术网

iPhone-类的实例。。。正在解除分配,但仍向其注册键值

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上设置断点,使其在调试器中停止。以下是

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

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

我使用观察者实现了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];
}

我的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。(尽管布拉德的解决方案是正确的!)