2012-07-17 2 views
1

나는 초보 ObjC 프로그래머 (지난 주 학습 시작)입니다. MKMapView의 중심에서 위도와 경도를 얻으려는 예상치 못한 결과가 있습니다.목표 C MKMapView EXC_BAD_ACCESS

나는지도 지역 변경 될 때 호출되는 다음과 같은 방법이 : 나는, 내가 MKMapView 개체의 출력을 받고 있어요 (널)받지 못했습니다 로그에서

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

을; 하지만 다음 줄에서는 처리되지 않은 EXC_BAD_ACCESS가 발생합니다.

도움을 주시면 감사하겠습니다. 요청이있는 경우 자세한 정보를 제공해 드리겠습니다.

감사합니다.

답변

2

CLLocationCoordinate2D은 Objective-C 개체가 아니며 C 구조체입니다. 직접 NSString으로 변환 할 수 없습니다.

시도 :

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

편집 : 당신이 목표 - C를 처음부터, 당신은이 문제가 발생하는 이유 오류 메시지가 너무 비 방법에 대한 통찰력을 좋아하는 줄 알았는데 설명 적.

[NSString stringWithFormat:...]은 형식 문자열과 임의의 수의 매개 변수를 취합니다. 그런 다음 형식 문자열을 구문 분석하고 필요에 따라 매개 변수를 채 웁니다.

형식 문자열의 %@ 토큰은 Objective-C 개체를 지정합니다. 즉 NSObject * 또는 그 서브 클래스이다. NSObject은 개체의 설명을 NSString *으로 제공하는 description 메서드를 정의합니다. stringWithFormat:%@ 토큰에 제공된 인수에 description을 호출하여 형식 문자열로 채 웁니다.

이것의 결과는 호출이 NSString 당신이 매개 변수의 오른쪽 종류를 제공 한 가정 때문에 description 전화를 당신의 CLLocationCoordinate2D 구조체와 objc_msgSend로 구성되어있다. 그런 다음 objc_msgSend 구조체가 마치 NSObject * 포인터 인 것처럼 처리하고 잘못된 위치에서 메모리에 액세스하려고하기 때문에 충돌이 발생합니다. 따라서 EXC_BAD_ACCESS.

면책 조항 : 이것은 2 년 만에 Objective-C에 대한 이해를 바탕으로 작성되었으므로 잘못된 것이 있으면 언제든지 고칠 수 있습니다.

+0

그냥 점심 식사에서 돌아 왔습니다. 이것은 대단한 감사입니다. :) – Xenoprimate