2011-01-03 8 views
0

私はXCODEに新しく、mapkitと注釈を使って作業しています。ビルドしてうまく動作した後、 ロード時にアプリケーションがクラッシュします。私はデバッガを走らせた。ブレークポイント1で停止問題:プログラム受信信号: "EXC_BAD_ACCESS"。

- : "EXC_BAD_ACCESS" いくつかのヒット数、

プログラムが信号を受信した後に 'のMapView:viewForAnnotationライン951'

は継続します。

私はallocやreleaseなどと何か関係がありますが、問題がどこにあるのか分かりません。

EDIT:PROBLEM SOLVED。

+0

デバッガを接続して実行させると(デバッグ設定だけでなく)、問題のある行ですぐに停止します。 – Eiko

+2

ところで、あなたのコードはひどく重複しています...コレクションにすべてを置き、繰り返しを使用すると、書込みと読み込みがはるかに簡単になります。それは本当にそれの価値がある! :-) – Eiko

+0

MKUserLocation.classは[MKUserLocationクラス]にする必要があります – Eiko

答えて

2

あなたの質問に直接答えはありませんが、長い "else if"コードを置き換えるswitch文を使用することを強くお勧めします。コードをもっときれいに見せ、コンパイラが最適化を行うことができます。

http://en.wikipedia.org/wiki/Switch_statement

編集。 他のコメント(江子から)を見てから、私はこの場合、このコード全体を削除して、それをいくつかのコレクションに置き換えたいと思うことにも同意しなければなりません。コードに重複が多すぎます。

+1

いいえ、実際には、ループを使用する必要があります。 – Eiko

+0

どこから始めたらいいのかわからない、まったく新しいです。私はuniプロジェクトのためにこれを完成させようとしています – Jon

1

真剣に行きすぎるコード。

ここで、これらのエラーを特定する方法を示します。

a)XCodeの「実行」メニューで「Objective-C例外で停止」を有効にします。これにより、エラーが発生した場所にかなり近づきます。スタックを見るだけで、あなたは理解することができます。

b)それでも問題が解決しない場合は、NSZombieルートを使用する必要はありませんが、NSZombieルートを試してみてください。 http://www.cocoadev.com/index.pl?DebuggingAutorelease。私は主にコードを見直すだけでよくわかります。

これが役に立ちます。

+1

まだ使用を開始していない場合は、デバッガのShift-Cmd-Y(実行メニュー)も使用してください。 – Sudhir

+0

何が私を悩ませているのですか?以前は完全に機能していましたが、アノテーションをいくつか追加してアノテーションの種類を追加することにしました。エラーは - (MainViewAnnotationView *)で停止します。mapView:(MKMapView *)mapView viewForAnnotation:(id )注釈 – Jon

+0

非常に多くの偉大なコードを表示するようにアドバイスされました – Jon

3

クラッシュがある場合、バックトレースがあります。投稿する。

1

mapView:viewForAnnotationは、plistsまたはコレクションを使用せずに、劇的に短くなる可能性があります。再利用識別子は、特定のタイプの注釈をデキューする場合や、高価ですが同一の設定作業を行う注釈をデキューする場合に便利です。アノテーションのすべてを同じ方法で初期化しているので、同じ再利用識別子をすべて問題なく使用できます。したがって、関数は次のように書くことができます:

- (MainViewAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    if(annotation == mapView.userLocation) return nil; 

    NSString* identifier = @"City"; 
    MainViewAnnotationView *newAnnotationView = (MainViewAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; 

    if(nil == newAnnotationView) 
    { 
     newAnnotationView = [[[MainViewAnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:identifier] autorelease]; 
    } 

    [newAnnotationView setEnabled:YES]; 
    [newAnnotationView setCanShowCallout:YES]; 

    return newAnnotationView; 
} 
+0

非常に詳細な例私はまだEXC BAD ACCESSエラーを受けていますが、ありがとうございます。 – Jon

+0

私は、デバッガを使用して少し読んで、エラーに詳しい情報を提供できるようになると思います。 –

+0

- [MapViewController tableView:cellforRowAtIndexPath:] CellIdentifier で停止し、アノテーション変数が有効範​​囲外だとしますか? EXC_BAD_ACCESSエラーの場合、 0x023dc668 <+0044> movzbl(%esi、%ecx、1)、%eax – Jon

関連する問題