1

私は初心者のObjCプログラマーです(先週学習を開始しました)。MKMapViewの中心から緯度と経度を取得しようとすると、予期しない結果が発生します。

マップがリージョンを変更したときに呼び出される次のメソッドがあります。

- (void)mapView:(MKMapView*)mapView regionDidChangeAnimated:(BOOL)animated {
    NSLog(@"------> %@", mapView);
    latLabel.text = [[NSString alloc] initWithFormat:@"%@", [mapView centerCoordinate]];
}

取得していない(null)ログで、MKMapViewオブジェクトのプリントアウトを取得しています。しかし、次の行で、未処理のEXC_BAD_ACCESSを取得します。

どんな助けでもありがたいです、そしてそれが要求されたら私はより多くの情報を提供させていただきます。

ありがとう。

4

1 に答える 1

2

CLLocationCoordinate2DこれはObjective-Cオブジェクトではなく、C構造体です。そのようなものに直接変換することはできませんNSString

試す:

CLLocationCoordinate2D center = [mapView centerCoordinate];
latLabel.text = [NSString stringWithFormat:@"(%f, %f)", center.latitude, center.longitude];

編集:あなたはObjective-Cに慣れていないので、この問題がどのように発生するのか、そしてなぜエラーメッセージがそれほど説明的でないのかについての洞察が欲しいと思うかもしれません。

[NSString stringWithFormat:...]フォーマット文字列と任意の数のパラメータを取ります。次に、フォーマット文字列を解析し、必要に応じてパラメータを入力します。

フォーマット文字列の%@トークンは、Objective-Cオブジェクトを指定します。つまり、NSObject *またはそのサブクラス。オブジェクトの説明を提供するメソッドをNSObject定義します。トークンに指定された引数を呼び出して、フォーマット文字列に入力します。descriptionNSString *stringWithFormat:description%@

この結果、正しい種類のパラメーターが指定されていることを前提としているため、構造体を使用objc_msgSendして呼び出しが行われます。次に、構造体をポインタであるかのように扱い、不適切な場所にあるメモリにアクセスしようとするため、クラッシュが発生します。したがって、。CLLocationCoordinate2DdescriptionNSStringobjc_msgSendNSObject *EXC_BAD_ACCESS

免責事項:これは、わずか2、3年後のObjective-Cの理解に基づいているため、何か間違っている場合は、遠慮なく訂正してください。

于 2012-07-17T11:08:16.500 に答える