Утечка памяти при использовании for (объект в массиве) с iPhone SDK - PullRequest
0 голосов
/ 18 ноября 2009

Я столкнулся с серьезными утечками памяти в одном из моих приложений, которые я строю. У меня есть UINavigatonController, который находится внутри UITabBarview. Внутри NavView есть представление MKMap. Когда вы нажимаете дополнительную кнопку в выноске, загружается подробный вид. В этом подробном представлении я пытаюсь заполнить таблицу из списка, используя цикл for (объект в массиве). Плист является массивом словарей. Я использую словари, чтобы найти один с ключом, который является названием выноски, а затем получить массив из этого словаря. В симуляторе все работает нормально, но я получаю огромные утечки памяти, делая это так, как я. Есть идеи, что происходит?

     - (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 - это ивар и массив маршрутов. Как вы можете видеть, я пробовал несколько способов размещения nstrings и массивов, но все они дают одинаковые утечки. Согласно инструменту производительности, я просочился из NSCFString, NSCFDictionary и NSCFArry. Я выпустил routeArray в dealloc, и он работает нормально, но если я отпускаю holderArray, он вылетает всякий раз, когда я возвращаюсь к своей карте из подробного вида. Полагаю, я просто не уверен, что делать со строками и словарем, используемыми в цикле 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];


}

Извините, если что-либо из перечисленного неясно. Дайте мне знать, и я могу попытаться перефразировать его.

1 Ответ

3 голосов
/ 18 ноября 2009

Будет ли testString истинным для не более одного ключа в holderArray? Если это так, вы, вероятно, должны выйти из цикла после установки routeArray. Если нет, то вы можете установить routeArray несколько раз, и все, кроме последнего массива, который вы ему присвоили, будут пропущены.

Кроме того, я не вижу, чтобы вы выпускали holderArray.

...