У меня есть следующий простой код для отслеживания MKAnnotations в моем MKMapView. Я создаю аннотации в цикле по списку мест, которые я хочу отслеживать. Я добавляю аннотации к классам моей коллекции, NSMutableDictionary и NSMutableArray, которые объявлены как свойства (не использующие ARC, но использую Xcode 4.2, поэтому использую «strong» вместо retain, поскольку они предположительно являются синонимами; для будущей совместимости с ARC).
Если я вызову эту процедуру во второй раз (скажем, когда список местоположений будет обновлен), инструмент «Утечки» утверждает, что аннотации просачиваются, а также сами объекты коллекции. (Я получаю один NSMUtableDictionary в моем списке утечек с трассировкой стека, указывающей на строку, где словарь создается и устанавливается в мое свойство, а также ряд небольших утечек, соответствующих аннотациям, и жалоб на NSMutableArray. и NSMutableDictionary). Однако я не вижу никаких нарушений правил управления памятью. У меня есть выпуск в сочетании с созданием моей аннотации через alloc / init. Я делаю неявное сохранение через «setter» своего свойства, и когда коллекции заменяются, они должны быть освобождены, а затем освободить все свои объекты содержимого. Если кто-нибудь увидит, где я ошибаюсь, я был бы признателен.
@property(strong, nonatomic) NSMutableArray *annotationList;
@property(strong, nonatomic) NSMutableDictionary *annotationLocations;
.
-(void) createMapAnnotations
{
if ([[self mapView] annotations])
[[self mapView] removeAnnotations:[[self mapView] annotations]];
[self setAnnotationList:[NSMutableArray array]];
[self setAnnotationLocations:[NSMutableDictionary dictionary]];
for (JEstablishmentLocation *loc in [[JLocationManager sharedLocationManager] localLocations])
{
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
[annotation setCoordinate:[[loc estCoordinates] coordinate]];
[[self mapView] addAnnotation:annotation];
[[self annotationList] addObject:[NSDictionary dictionaryWithObject:annotation forKey:[loc estKeyValue]]];
[[self annotationLocations] setObject:loc forKey:[annotation description]];
[annotation release];
}
[self centerOnCurrentLocation];
}