Я получаю утечки моих аннотаций.Код (сокращенный до минимума медведя), о котором идет речь:
- (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:]