2

我的注释泄露了。有问题的代码(精简到最低限度)是:

- (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:]

4

1 回答 1

5

好的,我为我解决了这个问题

我试图删除所有注释并添加新注释(但我的代码确保它没有删除用户位置)。这与该代码有关

我用这个代替了它

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

现在我没有遇到同样的问题。

于 2011-02-24T02:53:51.657 回答