【问题标题】:MKMapView Crash on Selection of Annotation and then Immediate deallocation of map viewMKMapView 在选择注释时崩溃,然后立即取消分配地图视图
【发布时间】:2015-02-24 13:29:36
【问题描述】:

我有一个 splitviewcontroller 应用程序,其中主视图控制器是 UITableView,详细视图控制器包含 MKMapView 和单个注释。当我在UITableView 中进行选择时,辅助视图会转到具有单个注释的不同地图视图。

当我选择一个注释,然后立即(在注释弹出框出现之前)选择一个单元格时,我收到一个EXC_BAD_ACCESS 崩溃。我使用 Zombies 工具尝试收集更多信息并收到此消息。

An Objective-C message was sent to a deallocated 'MKPopoverBasedAnnotationCalloutController' object (zombie)

我认为这里的问题是地图视图仍在尝试显示注释弹出框,但注释已被释放。

到目前为止我已经尝试过:

•在dealloc上设置MKMapView delegate nil

注意:我没有为注释使用任何自定义弹出框。在调用[mapView selectAnnotation:mp animated:YES]; 然后选择另一个单元格时,我也遇到了类似的问题。我通过不调用它来解决这个问题。这显然不是一个理想的解决方案。

关于如何解决这个问题的任何建议?或者任何关于这是 MapKit 的问题还是我的应用程序的问题的任何见解?

提前致谢, 克里斯

【问题讨论】:

  • 我正在使用 MkAnnotationView 并为该视图设置自定义图像。似乎当我使用MKPinAnnotationView 并设置图像时不会发生崩溃,但在MKPinAnnotationView 上设置图像并不能提供适当的功能(地图类型更改时仍会显示引脚)

标签: ios objective-c annotations mapkit uisplitviewcontroller


【解决方案1】:

我能够始终如一地重现该问题,它确实看起来像是 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
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多