5

マップビューに注釈とオーバーレイを追加しようとしていますが、ランダムにクラッシュします。これは 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;
}

ユーザーの操作で地図に注釈/オーバーレイを追加するより良い方法はありますか? このコードで何か間違ったことをしていますか? 円の大部分を描画しているように見えますが、クラッシュします... マップビューに特別なトリックはありますか?

4

2 に答える 2

4

まったく同じエラーが発生しています。

CG :: Path :: apply_transform(CGAffineTransform const&)はテスト命令にヒットし、EXC_BAD_ACCESSを取得します

これは特に、マップをダブルクリックしてMKCircleを拡大するときに発生します。

これを明確に言うことはできませんが、私の知る限り、この問題は、ダブルクリックしてズームした場合にのみシミュレーターで発生します。実際のデバイスから、またはオプションを使用してエラーを発生させることはできませんでした。 +クリックしてシミュレータを拡大します。

ですから、この時点で私はこれを「シミュレーターのバグ」の下に提出し、そのままにしておきました。

逆のことを発見した場合は、これが私のアプリに存在するバグであり、正しく再現できないかどうかを明確に知らないので、私に知らせてください。

編集:

これは最初は「答えではない」というフラグが立てられていたので、私の推測を裏付けるもう少し情報を提供します。

基本的に、両方のシナリオで、ジェスチャがMKCircleViewの再レンダリングを開始します。私が強く疑うのは、シミュレータが実際のデバイスのユーザーからは作成できないある種のジェスチャを生成できるためです。そのジェスチャが処理されている間、チェーンのどこかで失敗した期待です。

于 2011-11-20T21:44:52.907 に答える
-4

EXC_BAD_ACCESS の問題がどこにあるのかわかりません。しかし、メモリリークに大きな問題があります。init で作成したオブジェクトを解放する必要があります。上記のコードでは、オブジェクトを作成し、決して解放しません。これは EXC_BAD_ACCESS をスローしませんが、メモリを消費します。

次のオブジェクトを解放します。

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

MKCircleView* circleView = [[MKCircleView alloc] initWithOverlay:overlay];
于 2011-07-17T09:59:12.520 に答える