2013-04-10 2 views
2

iOS 6 MKMapView는 애플리케이션의 맵보기를 사용하여 (약 7-10 분 동안) 확대/축소를 시작할 때 많은 메모리를 사용하고있는 것 같습니다. 우리는 컨트롤러에서 MKMapView를 가지고 있는데, 그 중 일부는 총 메모리를 해제하지 않습니다 (내 응용 프로그램에서 ARC를 사용하고 있습니다). NIB를 통해 MKMapView를 할당하고 초기화하고 있습니다.iOS 6 MKMapView 메모리 누수 및 충돌이 발생하면 앱이 잠시 후 작동을 멈 춥니 다.

컨트롤러 1 -> 컨트롤러 2 (MKMapView있다)

1.5MB -> 40-60메가바이트 (I는하지만 사용, 누수를 찾기 위해 악기를 사용했다)

내가 올 컨트롤러 1로 돌아 가면 라이브 바이트가 7-10MB 인 것으로 보입니다. 컨트롤러 2를 방문 할 때마다 라이브 바이트가 약 2-3MB 증가하고, 응용 프로그램이 충돌 한 후 "수신 메모리 경고"라는 콘솔이 표시됩니다. 어느 누구도 도와 줄 수 있습니까? 더 자세한 정보가 필요하시면 알려주세요. 미리 감사드립니다.

답변

4

MKMapView가 작동하는 방식 때문입니다. 보류중인 작업이 있으므로 MapKit은 MKMapView를 유지하고 있으며 아직 실제로 할당이 해제되지 않았습니다. 그것은 그 자체로 문제가되지 않습니다. 문제는 여전히 메시지를 대리인에게 보냈다는 것입니다.

해결 방법은 간단합니다.보기 컨트롤러의 정리에서 맵보기의 위임을 nil로 설정하면 MKMapView가 메시지를 보낼 수 없습니다.

이는 MKMapViewDelegate 프로토콜 참조에 설명되어 있습니다 :

대리자를 설정하는 대한 MKMapView의 개체를 해제하기 전에 무기 호에 해당 개체의 위임 속성을 설정해야합니다. 이 작업을 수행 할 수있는 한 위치는지도 뷰를 처리하는 dealloc 메서드에 있습니다.

편집 : 오스카에게 위의 문서 인용문을 제공 한 upvote도 제공하십시오.

ARC를 감안할 때보기 컨트롤러의 dealloc에서 맵보기의 위임을 nil로 설정해야한다는 것을 의미합니다.

내 문제를 해결하는 이와 같은 작업을 수행 할 수 있습니다. 지도 유형 변경도 도움이됩니다.

- (void)applyMapViewMemoryHotFix{ 

switch (self.mapView.mapView.mapType) { 
    case MKMapTypeHybrid: 
    { 
     self.mapView.mapView.mapType = MKMapTypeStandard; 
    } 

     break; 
    case MKMapTypeStandard: 
    { 
     self.mapView.mapView.mapType = MKMapTypeHybrid; 
    } 

     break; 
    default: 
     break; 
} 
self.mapView.showsUserLocation = NO; 
self.mapView.delegate = nil; 
[self.mapView removeFromSuperview]; 
self.mapView = nil; 
} 

-(void)viewDidDisappear:(BOOL)animated 
{ 
    [self applyMapViewMemoryHotFix]; 
} 
+0

감사합니다. Saad Ansari !! 그래, 나는 뜨거운 수정 프로그램을 구현하고 무효로 mapview 대리인을 설정, 그것은 개선했지만 여전히 내 애플 리케이션을 충돌 특정 인스턴스 후 !! –