Утечка памяти при использовании json-данных на карте - PullRequest
1 голос
/ 02 октября 2011

У меня следующая проблема:

Я получаю доступ к API-интерфейсу foursquares и получаю строку JSON.Я анализирую эту строку с этой json-framework .После этого я сохраняю словари и массивы для доступа к дополнительной информации о местах (в частности, я использую explore API ).Таким образом, информация о месте хранится глубоко (для моего опыта) в дереве структуры json.И после получения необходимой информации (название места и координаты) я помещаю соответствующий значок на карту с такими же координатами и именем места, что и имя контакта.

И именно в той точке, где я хочу установитьимя булавки, я получаю утечку памяти.Так что тут что-то не так.Если я не установил название, все работает нормально.Таким образом, утечка памяти происходит только тогда, когда я устанавливаю название места для контакта.

Вот соответствующий фрагмент кода:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //Parse JSON string
    // Store incoming data into a string
    NSString *jsonString = [[NSString alloc] initWithData:self.fetchedJSONData encoding:NSUTF8StringEncoding];
    [self.fetchedJSONData setLength:0];

    // Create a dictionary from the JSON string     
    NSDictionary *results = [NSDictionary dictionaryWithDictionary:[jsonString JSONValue]];
    [jsonString release];

    NSDictionary *response = [NSDictionary dictionaryWithDictionary:[results objectForKey:@"response"]];

    NSArray *groups = [NSArray arrayWithArray:[response objectForKey:@"groups"]];
    NSDictionary *groupsDic = [groups lastObject];
    NSArray *items = [NSArray arrayWithArray:[groupsDic objectForKey:@"items"]];

   for (int i=0; i<[items count]; i++)
   {
        CLLocationCoordinate2D annotationCoord;
        MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init];
        NSDictionary* oneItemDoc = [NSDictionary dictionaryWithDictionary:[items objectAtIndex:i]]; 
        NSDictionary *singleVenue = [NSDictionary dictionaryWithDictionary:[oneItemDoc objectForKey:@"venue"]];             

        /*
         *          Leak here in the next two lines!
         *
         */

        NSString *titleName = [[[singleVenue objectForKey:@"name"] copy] autorelease]; 
        annotationPoint.title = titleName;

        NSDictionary *locationOfVenue = [NSDictionary dictionaryWithDictionary:[singleVenue objectForKey:@"location"]];

        annotationCoord.latitude = [[locationOfVenue objectForKey:@"lat"] doubleValue];
        annotationCoord.longitude = [[locationOfVenue objectForKey:@"lng"] doubleValue];               
        annotationPoint.coordinate = annotationCoord;

        [self.mapView addAnnotation:annotationPoint];
        [self.annotationsArray addObject:annotationPoint];
        [annotationPoint release];
   }
}

Таким образом, утечка происходит, когда я хочуустановить заголовок для annotationPoint.

Для каждого объекта, выбранного с помощью JSON, я получаю следующую утечку (размытые библиотеки - мои собственные библиотеки):

All blurred responsible libraries are my own app

ИмеетУ кого-нибудь есть предложения, как решить эту проблему?Я перепробовал много-много вещей.Таким образом, ключевой вопрос заключается в том, как правильно «передать» [singleVenue objectForKey:@"name"].Сначала я попытался установить его без копии и авто-релиза, но затем я получил объект зомби.Так что я не знаю, как это сделать.Я думаю, что проблема не в этих двух строках, а в некоторых строках над ними.Я прав?У меня также есть предположение, что мой сторонний анализатор json форсирует эту проблему (см. След утечки).

Поэтому я надеюсь, что кто-то может помочь мне решить эту проблему.Было бы здорово!

Обновление : Кажется, проблема не зависит от соответствующего анализатора JSON.Я тестировал свой код с другим парсером, та же проблема там.Так что это связано с моим кодом.

Я думаю, что знаю, в чем проблема.Так что утечка происходит после закрытия карты.Итак, после сделки.Возможно, я что-то там упустил.У меня есть mapview, и я также выпускаю его в dealloc и устанавливаю ноль в viewDidUnload.Я также освобождаю все другие массивы и т.д. в dealloc.Есть ли что-то еще (специфическое для карты и вида), которое мне нужно выпустить?Я думаю, что это может быть проблемой!

Обновление : решена проблема: мне пришлось установить название и субтитр всех пинов Foursquare в nil в методе dealloc, потому что значение (доступное черезанализатор JSON) каким-то образом был сохранен видом карты.Теперь все отлично работает!

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Решил проблему: мне пришлось установить для заголовка и подзаголовка всех выводов Foursquare значение nil в методе dealloc, потому что значение (доступное через анализатор JSON) каким-то образом сохранялось представлением карты.Теперь все работает отлично!

0 голосов
/ 21 ноября 2011

В аналогичной ситуации заголовок аннотации (MKPointAnnotation) не был выпущен должным образом.Решил это, просто установив mapView в nil непосредственно перед его выпуском.

Я думаю, что это гораздо безопаснее, чем вызывать дополнительный [title release], который также работает, но если mapView исправлен внутренне, это вызовет проблему.

...