2012-08-13 5 views
0

"... 주소에서 할당 해제 된 인스턴스로 전송되었습니다."라는 메시지와 함께 응용 프로그램에서 충돌이 발생합니다. 그래서, 나는 좀비 도구로 앱을 분석했고, 아래에 충돌을 일으키는 코드 단편을 제시했습니다. 아직이 오류의 원인이되는 시나리오를 찾지 못했습니다.deallocated 인스턴스로 전송 된 메시지 - 좀비와 함께 분석되었습니다.

(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
if ([view.annotation isKindOfClass:[MKUserLocation class]]) { 
} 
else { 
    CustomAnnotation *ann = (CustomAnnotation *) view.annotation; 
    if (ann.annotationType == BusAnnotationType) { 
     NSLog(@"accessory button tapped for annotation %@", view.annotation); 
     BusInfoViewController *viewController = [[BusInfoViewController alloc] initWithNibName:@"BusInfoViewController" bundle:nil]; 
     BusForStation *bus = [self getBusWithId:[(CustomAnnotation *)view.annotation ID]]; 
     viewController.currentBus = bus; 
     [self.navigationController pushViewController:viewController animated:YES]; 
     [viewController release]; 
    } 
} 

분석기 툴 라인에서 91.4 %를 얻는다 [self.navigationController과 pushViewController : 애니메이션의 ViewController : YES];

누구에게 무슨 문제가 있는지 알고 있나요?

답변

1

ARC (Automatic Reference Counting) 사용을 고려하십시오. Xcode는 메뉴 "Edit" ➞ "Refactor" ➞ "Convert to Objective-C ARC…"을 사용하여 프로젝트를 거의 완전 자동으로 변환 할 수 있습니다. 수동으로 메모리를 관리해야하는 이유가 몇 가지 있습니다.

정적 분석기 (메뉴 "Product" ➞ "Analyze")를 실행 해 볼 수도 있습니다.

+0

5.0보다 낮은 앱을 타겟팅하므로 ARC를 사용할 수 없습니까? – dorin

+0

@Dorin ARC는 iOS 4.0 이상에서 사용할 수 있습니다. 이 기능을 사용하려면 최신 Xcode 버전 중 하나를 사용해야합니다. –

0

당신이 가지고있는 문제는 뷰에 밀어 넣은 후 바로 viewController를 해제한다는 것입니다. 또한 setCurrentBus (BusInfoViewController에서)에 대한 고유 한 구현을 수행 한 경우 문제가있을 수 있습니다.

3

ARC로 변환하지 않고 비슷한 문제를 해결했다고 생각합니다. navigationController 내 viewController있는 mapView 포함되어 있습니다. 보기가로드되면 setRegion:myregion animated:YES으로 전화합니다. 애니메이션이 완료되기 전에 '뒤로'를 클릭하면 mapView에서 [respondsToSelector:] 메시지의 '할당 해제 된 인스턴스로 전송 된 메시지'오류가 발생합니다. myMapView를 릴리스하기 전에 myMapView.delegate = nil으로 설정하여이 문제를 해결했습니다.