MKMapView подтекает при удалении аннотации или только у меня? - PullRequest
2 голосов
/ 25 января 2011

Я получаю утечки моих аннотаций.Код (сокращенный до минимума медведя), о котором идет речь:

- (void)updateLocations:(NSArray *)result {
    [mapView removeAnnotations:locations];
    [locations removeAllObjects];
    [allLocations removeAllObjects];
    for (NSDictionary *location in result) {
        LocationAnnotation *annote = [[LocationAnnotation alloc] initWithInfo:location];
        [allLocations addObject:annote];
        [annote release];
    }
    [self updateAnnotations];
}

- (void)filterLocations {
    for (LocationAnnotation *annote in allLocations) {
        if (annote.typeFlag & filterFlags) {
            [locations addObject:annote];
        }
    }
}

- (void)updateAnnotations {
    [self filterLocations];
    [mapView addAnnotations:locations];
}

- (void)updateFilter {
    [mapView removeAnnotations:locations];
    [locations removeAllObjects];
    [self updateAnnotations];
}

allLocations - это массив, содержащий все аннотации (они не обязательно указаны на карте), а locations - этомассив, который содержит местоположения, которые фактически отображаются на карте.Когда вызывается updateLocations:, некоторые (или все, это меняется от теста к тесту) аннотации, добавленные на карту, протекают.История размещения аннотаций:

#   Category            Event Type  Timestamp   RefCt   Address     Size    Responsible Library Responsible Caller
0   LocationAnnotation  Malloc      16421111296 1       0x4953870   64      MyApp               -[MapViewController updateLocations:]
1   LocationAnnotation  Retain      16421383424 2       0x4953870   0       MyApp               -[MapViewController updateLocations:]
2   LocationAnnotation  Release     16421391104 1       0x4953870   0       MyApp               -[MapViewController updateLocations:]
3   LocationAnnotation  Retain      16444210176 2       0x4953870   0       MyApp               -[MapViewController filterLocations]
4   LocationAnnotation  Retain      16557738240 3       0x4953870   0       MapKit              -[MKQuadTrie insert:]
5   LocationAnnotation  Retain      16557750272 4       0x4953870   0       MapKit              -[MKAnnotationContainerView addAnnotation:]
6   LocationAnnotation  Retain      16564529408 5       0x4953870   0       MapKit              -[MKQuadTrie insert:]
7   LocationAnnotation  Release     17296397312 4       0x4953870   0       MapKit              -[MKAnnotationContainerView showAddedAnnotationsAnimated:]
8   LocationAnnotation  Retain      21832317184 5       0x4953870   0       MapKit              -[MKAnnotationContainerView removeAnnotation:]
9   LocationAnnotation  Autorelease 21832324096         0x4953870   0       MapKit              -[MKAnnotationContainerView removeAnnotation:]
10  LocationAnnotation  Release     21832350208 4       0x4953870   0       MapKit              -[MKQuadTrie remove:]
11  LocationAnnotation  Release     21920062208 3       0x4953870   0       MyApp               -[MapViewController updateLocations:]
12  LocationAnnotation  Release     21923836416 2       0x4953870   0       MyApp               -[MapViewController updateLocations:]
13  LocationAnnotation  Release     22050286336 1       0x4953870   0       Foundation          -[NSAutoreleasePool drain]

И, глядя на это, кажется, что виновником является то, что [MKQuadTrie insert:] вызывается дважды, тогда как вызывается только один [MKQuadTrie remove:].Я что-то упустил и это моя ошибка, или это ошибка в MKMapKit?

Редактировать: Я видел историю распределения с 14 вызовами [MKQuadTrie insert:] и только 1 [MKQuadTrie remove:]

1 Ответ

5 голосов
/ 24 февраля 2011

Хорошо, я решил эту проблему для себя

Я пытался удалить все аннотации и добавить новые (но мой код проверял, что он не удаляет местоположение пользователя).Это было как-то связано с этим кодом

Я заменил его на этот

[self.map removeAnnotations: [self.map.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]]];

И теперь у меня нет той же проблемы.

...