2011-07-17 8 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; 
} 

은 주석을 추가 할 수있는 더 좋은 방법이 있나요/사용자 상호 작용이있는지도에 오버레이가 있습니까? 이 코드에서 잘못된 것이 있습니까? 그것은 대부분의 원을 그리는 것처럼 보이지만 충돌이 발생합니다 ... mapviews에 대한 특별한 트릭이 있습니까?

+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

프로젝트가 아크를 사용 중입니다. 그래서 나는 그들을 풀어 놓을 책임이 없습니다. – utahwithak

4

:

CG :: 경로 : apply_transform (CGAffineTransform CONST &) 테스트 명령을 명중하고 저를 줄 것이다 EXC_BAD_ACCESS

이것은 특히 맵을 두 번 클릭하여 MKCircle을 확대 할 때 발생합니다.

나는 확실히 말할 수는 없지만이 문제는 두 번 클릭하여 확대/축소 할 때 시뮬레이터에서만 발생합니다. 실제 장치에서 오류를 일으킬 수는 없습니다. 또는 옵션 + 클릭을 사용하여 시뮬레이터를 확대/축소합니다.

그래서이 시점에서 "시뮬레이터 버그"아래에이 파일을 작성하고 그대로 두었습니다.

반대로 생각이 나면, 올바르게 재현 할 수없는 내 앱에 존재하는 버그인지 여부를 명시 적으로 알지 못하기 때문에 저를 귀찮게하기 때문에 알려주십시오.

편집 :

내 추측을 지원하는 조금 더 정보를 제공 할 것이다, 그래서이 "없는 답변"으로 처음 신고 된

.

기본적으로 우리의 시나리오 모두에서 MKCircleView의 재 렌더링을 시작하는 제스처가 있습니다. 시뮬레이터는 사용자가 생성 할 수없는 제스처를 생성 할 수 있기 때문에 MKCircleView의 재 렌더링을 시도합니다. 실제 장치에서는 그 제스처가 처리되는 동안 체인 아래 어딘가에서 기대가 실패합니다.

+0

@yelirekim이 문제를 해결 했습니까? 시뮬레이터와 장치 모두에서 발생하지만 정확히 동일한 문제가 있습니다. – Undistraction

관련 문제