Iphone 如果在添加批注时进行缩放,则MKMapView会崩溃

Iphone 如果在添加批注时进行缩放,则MKMapView会崩溃,iphone,ios,mkmapview,mapkit,Iphone,Ios,Mkmapview,Mapkit,看起来我遇到了一个问题,如果在更改地图的可见区域时添加注释,我可以可靠地导致我的MKMapView崩溃。我将导致它的代码归结为一个非常简单的实现,并在这里复制它: NSMutableArray *pointAnnotationArray = [[NSMutableArray alloc] init]; MKCoordinateRegion coordRegion = [mapViewOutlet region]; float randMax = 0.1; for (int i = 0; i &

看起来我遇到了一个问题,如果在更改地图的可见区域时添加注释,我可以可靠地导致我的
MKMapView
崩溃。我将导致它的代码归结为一个非常简单的实现,并在这里复制它:

NSMutableArray *pointAnnotationArray = [[NSMutableArray alloc] init];
MKCoordinateRegion coordRegion = [mapViewOutlet region];
float randMax = 0.1;

for (int i = 0; i < 100; i++){
    float randomDeviation1 =  (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * randMax) - (randMax / 2);
    float randomDeviation2 =  (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * randMax) - (randMax / 2);

    MKPointAnnotation *point = [[MKPointAnnotation alloc] init];        
    CLLocationCoordinate2D pointLocation = CLLocationCoordinate2DMake(coordRegion.center.latitude + randomDeviation1, coordRegion.center.longitude + randomDeviation2);
    [point setCoordinate:pointLocation];    
    [pointAnnotationArray addObject: point];
}

[mapViewOutlet addAnnotations:[NSArray arrayWithArray:pointAnnotationArray]];

添加新注释时,对可见注释的更改似乎存在某种问题-可能是
MKMapView
中的问题,因为它可能是在辅助线程中进行更新的(这样很挑剔)。我要做的是响应以下两个
MKMapViewDelegate
方法:

  • mapView:regionWillChangeAnimated:
  • mapView:RegiondChangeAnimated:
在第一种情况下,设置一个标志,指定用户正在将地图移动到
YES
。在第二个选项中,将标志设置为
NO
。然后,每当您想要添加新注释时,请检查该标志。如果是
,则可以立即更新。如果是
YES
,请将注释添加到可变集。在
mapView:regionDidChangeAnimated:
中,在清空集合之前,将该集合中的所有注释添加到地图视图中


这应该可以解决问题,即使这不是一个优雅的解决方案。您可以在Xcode中打开断点窗格并单击add按钮,然后选择“Exception breakpoint”,这样当您的应用程序崩溃时,您可以得到确切的行而不是
main.m

在添加新注释时,对可见注释的更改似乎出现了某种问题-可能是
MKMapView
中的问题,因为它可能是在一个辅助线程中进行更新的(这样很挑剔)。我要做的是响应以下两个
MKMapViewDelegate
方法:

  • mapView:regionWillChangeAnimated:
  • mapView:RegiondChangeAnimated:
在第一种情况下,设置一个标志,指定用户正在将地图移动到
YES
。在第二个选项中,将标志设置为
NO
。然后,每当您想要添加新注释时,请检查该标志。如果是
,则可以立即更新。如果是
YES
,请将注释添加到可变集。在
mapView:regionDidChangeAnimated:
中,在清空集合之前,将该集合中的所有注释添加到地图视图中


这应该可以解决问题,即使这不是一个优雅的解决方案。您可以在Xcode中打开断点窗格,单击添加按钮,然后选择“异常断点”,以便在应用程序崩溃时,您得到的是准确的行,而不是
main.m

我遇到了一个类似的问题,我添加了一组从服务器获取的注释,并将它们从json转换为nsarray,但由于这是在后台线程中完成的,因此在添加和删除到mapview时,我遇到了NSGenericeException,我的解决方案是在主线程上执行添加-删除操作,如下所示,所有操作都正常工作,即使用户放大,也可以添加删除注释。但是添加时会有轻微延迟,因为我尝试使用1k到2k大小的数组。对于较小的东西应该是好的

 dispatch_async(dispatch_get_main_queue(),
 ^{
        [self.mapView removeAnnotations:self.mapView.annotations];
        [self.mapView addAnnotations:tempNSArray];

    });

我遇到了一个类似的问题,我添加了一组从我的服务器获取的注释,并将它们从json转换为nsarray,但由于这是在后台线程中完成的,当添加和删除到mapview时,我遇到了NSGenericeException,我的解决方案是在主线程上执行添加-删除操作,如下所示,所有操作都正常工作,即使当用户放大时,您也可以添加或删除注释。但添加时会有轻微的延迟,因为我正在尝试1k到2k大小的数组。对于较小的东西应该是好的

 dispatch_async(dispatch_get_main_queue(),
 ^{
        [self.mapView removeAnnotations:self.mapView.annotations];
        [self.mapView addAnnotations:tempNSArray];

    });

谢谢你的建议;这确实起了作用。另外,我本应该更明确一些,但我在测试中确实使用了异常断点,这就是为什么我对没有获得有关异常的更多信息感到困惑的原因;这确实起了作用。另外,我本应该更明确一些,但我在测试中确实使用了异常断点,这就是为什么我对没有获得有关异常的更多信息感到困惑的原因。