2011-07-17 93 views
5

我想添加批註和覆蓋到一個mapview,但它隨機崩潰。這是一個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

該項目正在使用ARC。所以我不負責釋放它們。 – utahwithak

4

我已經得到確切的同樣的錯誤:

CG ::路徑:: apply_transform(CGAffineTransform常量&)將達到一個測試指令,並給我EXC_BAD_ACCESS

當在地圖上雙擊以放大MKCircle時,會發生這種情況。

我不能說這明確,但據我所知,這個問題只發生在模擬器上,當你使用雙擊來縮放,我從來沒有能夠從實際設備導致錯誤,或者通過使用選項+單擊放大模擬器。

所以在這一點上我已經提交了這個「模擬器的bug」,並將其留在那。

如果你確實發現任何相反的事情,請讓我知道,因爲它真的困擾我不明確知道這是否是我的應用程序中存在的錯誤,我無法正確再現。

編輯:

這最初被標記爲「不回答」,所以我會提供多一點點信息,支持我的猜想。

基本上在我們的兩種場景中,一個手勢觸發了MKCircleView的重新渲染,我強烈懷疑的是,因爲模擬器能夠生成某種不能從用戶創建的手勢實際的設備,在該鏈接下的某個位置出現失敗的期望,並且該姿勢得到處理。

+0

@yelirekim你解決了這個問題嗎?我有完全相同的問題,雖然它發生在模擬器和設備上。 – Undistraction

相關問題