MKMapView 在选择注释时崩溃,然后立即释放地图视图
MKMapView Crash on Selection of Annotation and then Immediate deallocation of map view
我有一个 splitviewcontroller 应用程序,其中主视图控制器是一个 UITableView
,详细视图控制器包含一个 MKMapView
和一个注释。当我在 UITableView
中创建 selection 时,辅助视图会通过单个注释转至不同的地图视图。
当我 select 注释然后紧接着(在注释弹出窗口出现之前)select 一个单元格时,我收到 EXC_BAD_ACCESS
崩溃。我使用 Zombies 工具尝试收集更多信息并收到此消息。
An Objective-C message was sent to a deallocated 'MKPopoverBasedAnnotationCalloutController' object (zombie)
我认为这里的问题是地图视图仍在尝试显示注释弹出窗口,但注释已被解除分配。
到目前为止我已经尝试过:
•在 dealloc
上设置 MKMapView
委托 nil
注意:我没有为注释使用任何自定义弹出窗口。在调用 [mapView selectAnnotation:mp animated:YES];
然后 selecting 另一个单元格时,我也遇到了类似的问题。我通过不调用它来解决这个问题。这显然不是一个理想的解决方案。
关于如何解决这个问题有什么建议吗?或者关于它是 MapKit
的问题还是我的应用程序的问题的任何见解?
提前致谢,
克里斯
我一直能够重现这个问题,它看起来确实像是 Apple 的 mapkit 代码的错误。我能够修复它的唯一方法是为 MKMapView
创建一个单例
-(MKMapView*)mapview{
static MKMapView *_mapview = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_mapview = [[MKMapView alloc] initWithFrame:[UIScreen mainScreen].bounds];
_mapview.showsPointsOfInterest = NO;
_mapview.pitchEnabled = NO;
});
return _mapview;
}
重要说明,当你删除地图时不要清除注释,等到你初始化它..
所以不在这里...
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[self.mapview removeFromSuperview];
self.mapview.delegate = nil; //AND OR IN DEALLOC
}
但是这里...
- (void)viewDidLoad{
[super viewDidLoad];
[self.view addSubview:self.mapview];
self.mapview.delegate = self;
[self.mapview removeAnnotations:[self.mapview annotations]];
//RECREATE THOSE ANNOTATIONS
}
我有一个 splitviewcontroller 应用程序,其中主视图控制器是一个 UITableView
,详细视图控制器包含一个 MKMapView
和一个注释。当我在 UITableView
中创建 selection 时,辅助视图会通过单个注释转至不同的地图视图。
当我 select 注释然后紧接着(在注释弹出窗口出现之前)select 一个单元格时,我收到 EXC_BAD_ACCESS
崩溃。我使用 Zombies 工具尝试收集更多信息并收到此消息。
An Objective-C message was sent to a deallocated 'MKPopoverBasedAnnotationCalloutController' object (zombie)
我认为这里的问题是地图视图仍在尝试显示注释弹出窗口,但注释已被解除分配。
到目前为止我已经尝试过:
•在 dealloc
上设置MKMapView
委托 nil
注意:我没有为注释使用任何自定义弹出窗口。在调用 [mapView selectAnnotation:mp animated:YES];
然后 selecting 另一个单元格时,我也遇到了类似的问题。我通过不调用它来解决这个问题。这显然不是一个理想的解决方案。
关于如何解决这个问题有什么建议吗?或者关于它是 MapKit
的问题还是我的应用程序的问题的任何见解?
提前致谢, 克里斯
我一直能够重现这个问题,它看起来确实像是 Apple 的 mapkit 代码的错误。我能够修复它的唯一方法是为 MKMapView
-(MKMapView*)mapview{
static MKMapView *_mapview = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_mapview = [[MKMapView alloc] initWithFrame:[UIScreen mainScreen].bounds];
_mapview.showsPointsOfInterest = NO;
_mapview.pitchEnabled = NO;
});
return _mapview;
}
重要说明,当你删除地图时不要清除注释,等到你初始化它..
所以不在这里...
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[self.mapview removeFromSuperview];
self.mapview.delegate = nil; //AND OR IN DEALLOC
}
但是这里...
- (void)viewDidLoad{
[super viewDidLoad];
[self.view addSubview:self.mapview];
self.mapview.delegate = self;
[self.mapview removeAnnotations:[self.mapview annotations]];
//RECREATE THOSE ANNOTATIONS
}