2011-07-17 10 views
5

注釈とオーバーレイをマップビューに追加しようとしていますが、ランダムにクラッシュします。それはEXC_BAD_ACCESSエラーですが、ゾンビは何も教えてくれません。 CG :: Path :: apply_transform(CGAffineTransform const &)でクラッシュしているとのことです。私はどこでこれが起こっているのか見てきましたが、それを特定することはできません。mkmapviewにオーバーレイを追加するとアプリケーションがクラッシュする

ibでmapviewを作成しています。デリゲートとすべての設定が正しく行われました。時にはうまく動作し、ランダムにクラッシュします。 私は、注釈を追加し、

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; 
} 

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

+0

その価値については、私はほぼ同じコードを持っており、まったく同じ断続的なクラッシュを経験しています。間違いなくMKMapView addOverlayによって発生しています:そして、任意の時に発生するようです。追加されるオーバーレイの数にリンクされていません。問題を解決する場合は、ここに回答を追加してください。私は同じことをします。 – Undistraction

+0

ここに1ndivisibleの投稿(http://stackoverflow.com/questions/8266950/debugging-crash-in-coregraphics-mapkit)は、この同じクラッシュをカバーしています。それは5.0固有です。 – cbowns

+0

私はこの同じエラーが発生していると思いますが、このメッセージも表示されます: "エラー:アドレスにオブジェクトファイルのセクションを指すセクションがありません" –

答えて

-4

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

リリース次のオブジェクト:

私は正確に同じエラーを取得してきた
MKPointAnnotation *pa = [[MKPointAnnotation alloc] init]; 

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

プロジェクトはARCを使用しています。だから私は彼らを解放する責任はない。 – utahwithak

4

CG ::パス:: apply_transform(CGAffineTransform constの&)テスト命令をヒットし、私を与えるだろうEXC_BAD_ACCESS

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

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

この時点で私はこれを「シミュレータのバグ」に書いておきました。

逆に何かを発見した場合は、私が正しく再現できないバグであるかどうかを明示的に知らないでください。

編集:

これは「ない答え」として最初にフラグが立てられたので、私は私の推測を支える少しより多くの情報を提供します。

基本的に私たちのシナリオの両方で、ジェスチャーはMKCircleViewの再レンダリングを起動していますが、シミュレータはユーザからの何かのジェスチャを生成できます実際のデバイスでは、そのジェスチャーが処理されている間、チェーンのどこかに期待できないものがあります。

+0

@yelirekimこの問題を解決しましたか?私は全く同じ問題を抱えていますが、シミュレータとデバイスの両方で発生しています。 – Undistraction