当我向mkmapview添加叠加层时应用崩溃

uta*_*hak 5 iphone objective-c mkmapview mkoverlay

我正在尝试将注释和叠加添加到mapview,但它会随机崩溃.这是一个EXC_BAD_ACCESS错误,但僵尸并没有告诉我任何事情.它说它崩溃在CG :: Path :: apply_transform(CGAffineTransform const&)上.我到处都看到为什么会这样,但无法确定它.

我在ib中创建mapview并让代表和所有设置正确.它会工作,然后随机崩溃.我正在使用手势识别器添加注释和叠加

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

[doubleTap setNumberOfTapsRequired:2];
[self.mapView addGestureRecognizer:doubleTap];
Run Code Online (Sandbox Code Playgroud)

- (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];


    }

}
Run Code Online (Sandbox Code Playgroud)

以及每个人的观点:

-(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;
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法通过用户交互向地图添加注释/叠加?我在这段代码中做错了吗?它似乎画了大部分圈子然后崩溃...... mapviews有一些特殊的技巧吗?

Cyp*_*ian -4

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

释放以下对象:

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

MKCircleView* circleView = [[MKCircleView alloc] initWithOverlay:overlay];
Run Code Online (Sandbox Code Playgroud)

  • 该项目正在使用 ARC。所以我不负责释放它们。 (2认同)