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