【问题标题】:App crashing when I add overlay to mkmapview当我将叠加层添加到 mkmapview 时应用程序崩溃
【发布时间】:2011-07-17 00:17:40
【问题描述】:

我正在尝试向地图视图添加注释和覆盖,但它随机崩溃。这是一个 EXC_BAD_ACCESS 错误,但僵尸什么也没告诉我。它说它在 CG::Path::apply_transform(CGAffineTransform const&) 上崩溃。我到处寻找为什么会发生这种情况,但无法确定。

我正在 ib 中创建地图视图,并正确设置了代表和所有内容。它有时会工作,然后随机崩溃。 我正在使用手势识别器来添加注释和覆盖

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] 
                                     initWithTarget:self action:@selector(handleDoubleTap:)];

[doubleTap setNumberOfTapsRequired:2];
[self.mapView addGestureRecognizer:doubleTap];

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer
{

    if (gestureRecognizer.state == UIGestureRecognizerStateRecognized){ 
        CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView];   
        CLLocationCoordinate2D touchMapCoordinate = 
        [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];


        //add pin where user touched down...
        MKPointAnnotation *pa = [[MKPointAnnotation alloc] init];
        pa.coordinate = touchMapCoordinate;
        //[pa setTitle:@"title"];
        [mapView addAnnotation:pa];

        MKCircle* circle=[MKCircle circleWithCenterCoordinate:touchMapCoordinate radius:500];
        [mapView addOverlay:circle];


    }

}

以及每个人的观点:

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay 
{
    if ([overlay isKindOfClass:[MKCircle class]]) {
        MKCircleView* circleView = [[MKCircleView alloc] initWithOverlay:overlay];
        circleView.strokeColor = [UIColor redColor];
        circleView.lineWidth = 1.0;
        circleView.fillColor = [UIColor blackColor];
        circleView.alpha=.5;
        return circleView;

    }
    else
        return nil;

}


- (MKAnnotationView *)mapView:(MKMapView *)localmapView viewForAnnotation:(id <MKAnnotation>)annotation
{

    if (![annotation isKindOfClass:[MKUserLocation class]]) {
        static NSString *AnnotationIdentifier = @"Annotation";
        MKPinAnnotationView* pinView = (MKPinAnnotationView *)[localmapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
        if (!pinView)
        {
            pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
            pinView.pinColor = MKPinAnnotationColorRed;
            pinView.animatesDrop = YES;
        }
        else
        {
                pinView.annotation = annotation;
            }
            return pinView;

        }
        return nil;
}

有没有更好的方法通过用户交互向地图添加注释/叠加?我在这段代码中做错了吗?它似乎绘制了大部分圆圈,但随后崩溃......地图视图有什么特殊技巧吗?

【问题讨论】:

  • 对于它的价值,我拥有几乎完全相同的代码,并且我正在经历完全相同的间歇性崩溃。它肯定是由 MKMapView addOverlay: 引起的,并且似乎发生在任意时间。它与添加的叠加层数量无关。如果您解决了问题,请在此处添加答案,我也会这样做。
  • 1ndivisible 的帖子 (stackoverflow.com/questions/8266950/…) 涵盖了同样的崩溃。它是 5.0 特有的。
  • 我想我遇到了同样的错误,但也看到了这条消息:“错误:地址不包含指向目标文件中某个部分的部分”

标签: iphone objective-c mkmapview mkoverlay


【解决方案1】:

我遇到了完全相同的错误:

CG::Path::apply_transform(CGAffineTransform const&) 将执行测试指令并给我一个 EXC_BAD_ACCESS

这特别发生在使用双击地图放大 MKCircle 时。

我不能肯定地说,但据我所知,此问题仅在您使用双击缩放时出现在模拟器上,我从未能够从实际设备中导致错误,或者通过使用 option+click 来放大模拟器。

因此,此时我已将其归档在“模拟器错误”下并留在那里。

如果您确实发现了任何相反的情况,请告诉我,因为不明确知道这是否是我的应用程序中存在的一个我无法正确重现的错误真的让我很困扰。

编辑:

这最初被标记为“不是答案”,因此我将提供更多信息来支持我的猜想。

基本上,在我们的两个场景中,一个手势都会触发 MKCircleView 的重新渲染,我强烈怀疑是因为模拟器能够生成某种手势,而这种手势在实际中无法从用户创建设备,则在处理该手势时,链条的某处存在失败的期望。

【讨论】:

  • @yelirekim 你解决了这个问题吗?我遇到了完全相同的问题,尽管它同时出现在模拟器和设备上。
【解决方案2】:

我不确定您的 EXC_BAD_ACCESS 问题出在哪里。但是您在泄漏内存方面遇到了一个大问题。您必须释放您使用 init 创建的对象。在上面的代码中,您创建对象并且从不释放它们。这不会抛出 EXC_BAD_ACCESS 但它会消耗你的内存。

释放以下对象:

MKPointAnnotation *pa = [[MKPointAnnotation alloc] init];

MKCircleView* circleView = [[MKCircleView alloc] initWithOverlay:overlay];

【讨论】:

  • 该项目正在使用 ARC。所以我不负责释放它们。
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多