У меня следующая проблема:
Я получаю доступ к 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, я получаю следующую утечку (размытые библиотеки - мои собственные библиотеки):
ИмеетУ кого-нибудь есть предложения, как решить эту проблему?Я перепробовал много-много вещей.Таким образом, ключевой вопрос заключается в том, как правильно «передать» [singleVenue objectForKey:@"name"]
.Сначала я попытался установить его без копии и авто-релиза, но затем я получил объект зомби.Так что я не знаю, как это сделать.Я думаю, что проблема не в этих двух строках, а в некоторых строках над ними.Я прав?У меня также есть предположение, что мой сторонний анализатор json форсирует эту проблему (см. След утечки).
Поэтому я надеюсь, что кто-то может помочь мне решить эту проблему.Было бы здорово!
Обновление : Кажется, проблема не зависит от соответствующего анализатора JSON.Я тестировал свой код с другим парсером, та же проблема там.Так что это связано с моим кодом.
Я думаю, что знаю, в чем проблема.Так что утечка происходит после закрытия карты.Итак, после сделки.Возможно, я что-то там упустил.У меня есть mapview, и я также выпускаю его в dealloc и устанавливаю ноль в viewDidUnload.Я также освобождаю все другие массивы и т.д. в dealloc.Есть ли что-то еще (специфическое для карты и вида), которое мне нужно выпустить?Я думаю, что это может быть проблемой!
Обновление : решена проблема: мне пришлось установить название и субтитр всех пинов Foursquare в nil в методе dealloc, потому что значение (доступное черезанализатор JSON) каким-то образом был сохранен видом карты.Теперь все отлично работает!