gpt4 book ai didi

ios - 在 mapView regionDidChangeAnimated 中获取 exec bad access 错误

转载 作者:行者123 更新时间:2023-11-29 12:43:27 32 4
gpt4 key购买 nike

我正在使用 showAnnotations 方法在 iOS7 中的 MKMapView 上显示我的标记。有时它可以完美运行并显示所有注释,但有时它会出现 EXEC_BAD_ACCESS 错误。

这是我的代码。

NSArray *annotations = MapView.annotations;
_mapNeedsPadding = YES;
[MapView showAnnotations:annotations animated:YES];

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
if(_mapNeedsPadding){
[mapView setVisibleMapRect:mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:YES];
_mapNeedsPadding = NO;
}
}

最佳答案

在显示的代码中,您将获得 EXC_BAD_ACCESS因为打电话 setVisibleMapRect原因regionDidChangeAnimated由 map View 再次调用,开始无限递归。

即使您使用 bool 标志 _mapNeedsPadding为了可能阻止这种递归,问题是标志被设置为 NO 之后 setVisibleMapRect已经被调用(并且它已经调用了 regionDidChangeAnimated 并且标志永远不会设置为 NO )。

所以你的代码调用setVisibleMapRect这导致regionDidChangeAnimated再次调用导致无限递归导致堆栈溢出导致EXC_BAD_ACCESS .


“快速修复”是设置 _mapNeedsPadding 调用setVisibleMapRect之前:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
if(_mapNeedsPadding){
_mapNeedsPadding = NO; // <-- call BEFORE setVisibleMapRect
[mapView setVisibleMapRect:mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:YES];
}
}


但是,我一开始并不推荐这种方法。

相反,您应该手动计算 MKMapRect根据您要显示的注释并调用 setVisibleMapRect:edgePadding:animated:来自主要代码(而不是 showAnnotations:animated: )。

并且,不要在 regionDidChangeAnimated 中实现或做任何事情.

例子:

NSArray *annotations = MapView.annotations;
//_mapNeedsPadding = YES;
//[MapView showAnnotations:annotations animated:YES];

MKMapRect rectForAnns = MKMapRectNull;
for (id<MKAnnotation> ann in annotations)
{
MKMapPoint annPoint = MKMapPointForCoordinate(ann.coordinate);

MKMapRect annRect = MKMapRectMake(annPoint.x, annPoint.y, 1, 1);

if (MKMapRectIsNull(rectForAnns))
rectForAnns = annRect;
else
rectForAnns = MKMapRectUnion(rectForAnns, annRect);
}

UIEdgeInsets rectInsets = UIEdgeInsetsMake(100, 20, 10, 10);

[MapView setVisibleMapRect:rectForAnns edgePadding:rectInsets animated:YES];


//Do NOT implement regionDidChangeAnimated...
//- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
// if(_mapNeedsPadding){
// [mapView setVisibleMapRect:mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:YES];
// _mapNeedsPadding = NO;
// }
//}

关于ios - 在 mapView regionDidChangeAnimated 中获取 exec bad access 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24276924/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com