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
 }