2009-11-18 4 views
0

건물에있는 응용 프로그램 중 하나에서 심각한 메모리 누수가 발생합니다. UITabBarview 안에있는 UINavigatonController 있습니다. NavView 내부에는 MKMap보기가 있습니다. 콜 아웃에서 액세서리 버튼을 클릭하면 상세보기가로드됩니다. 자세히보기에서 for (array in object) 루프를 사용하여 plist에서 테이블을 채우려고합니다. plist는 사전 배열입니다. 나는 사전을 달려서 콜 아웃 (callout)의 제목 인 키가있는 사전을 찾은 다음 해당 사전에서 배열을 가져온다. 그것은 모든 simulaor에서 잘 작동하지만 나는 그것을하는 방식으로 대규모 메모리 누수가 일어나고있다. 어떤 아이디어가 계속되고 있니?iPhone SDK에서 (객체 배열로) 사용할 때의 메모리 누수

 - (void)viewDidLoad { 
     self.title = @"Route Details"; 
     NSString *path = [[NSBundle mainBundle] pathForResource:@"stopLocation" ofType:@"plist"]; 
     holderArray = [[NSMutableArray alloc] initWithContentsOfFile:path]; 
     [self getRouteArray]; 
     routeDetails.delegate = self; 
     routeDetails.dataSource = self; 

    } 
    -(void)getRouteArray{ 

     for (NSMutableDictionary *dictionary in holderArray) { 
      //NSString *stopName = [dictionary objectForKey:@"StopName"]; 
      //NSString *stopName = [[NSString alloc] initWithString:[dictionary objectForKey:@"StopName"]]; 

      BOOL testString = [currentRoute isEqualToString:[dictionary objectForKey:@"StopName"]]; 

      if (testString) { 
       routeArray = [[NSMutableArray alloc] initWithArray:[dictionary objectForKey:@"RouteService"]]; 
      } 
     } 
    } 
- (void)dealloc { 

    [routeArray release]; 
    [routeDetails release]; 

    [super dealloc]; 
} 

holderArray는 ivar이고 경로 배열도 마찬가지입니다. 보시다시피 nstrings과 배열을 할당하는 몇 가지 방법을 시도했지만 모두 똑같은 누출을 일으키는 것 같습니다. NSCFString, NSCFDictionary 및 NSCFArry에서 누출되고있는 성능 도구에 따르면. 내가 dealloc에 ​​routeArray를 발표하고 괜찮 았지만, holdArray를 릴리스하면 상세 뷰에서 내지도로 돌아갈 때마다 충돌이 발생합니다. 나는 for 루프에서 사용 된 문자열과 사전을 다루는 방법을 확실히 알지 못한다.

그냥 상세보기과 같이 생성되는 추가 : 위의가 불분명 한 경우

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{ 


    NSString *selectedRouteName = [NSString stringWithFormat:@"%@",view.annotation.title]; 

    RouteDetailView *rdc = [[RouteDetailView alloc] initWithNibName:@"RouteDetailView" bundle:nil]; 
    [rdc setCurrentRoute:selectedRouteName]; 
    [self.navigationController pushViewController:rdc animated:YES]; 
    [rdc release]; 


} 

죄송합니다. 알려 주시면 다시 말해 볼 수 있습니다.

답변

3

testStringholderArray에 최대 하나의 키에 해당됩니까? 그렇다면 routeArray을 설정 한 후 루프를 빠져 나와야합니다. 그렇지 않다면 routeArray을 여러 번 설정할 수 있으며 할당 한 마지막 배열을 제외한 모든 것이 유출됩니다.

또한 holderArray을 공개하지 않습니다.

+0

예 testString은 한 번만 true입니다. 원래 holderArray를 공개하지 않은 이유는 navController를 다시 방문했을 때 응용 프로그램이 중단 될 것이기 때문입니다. 내가 휴식을 추가하고 holderArray에 대한 릴리스를 교체하고 그것이 작동하는 것 같습니다. 당신의 도움을 주셔서 감사합니다. 오전 4 시까 지 다른 문제를 고친 후 내 마음이 멍하게되어이 말은 나를 괴롭혔지만 그 대답은 너무 간단했다. –

관련 문제