2010-07-30 17 views
6

Estoy trabajando en una aplicación de iPhone que muestra un mapa con varias superposiciones de círculo en ciertas ubicaciones. Me encuentro con serios problemas de memoria y bloqueos cuando agrego más de 6 círculos y alejo lo suficiente como para que todos estén visibles. Cuando acerco la imagen de modo que solo se vean 2 círculos, todo está bien. Cuando elimino las MKOverlays, todo funciona bien.MKOverlays múltiples en un MKMapView conducen a advertencias de memoria

¿Alguien que reconoce este comportamiento?

Código que crea las superposiciones. Almaceno las superposiciones en un NSMutableDictionary para referencia futura (para poder eliminarlos del mapa y para evitar la doble superposiciones)

- (void)updateMarkersForZones:(NSArray *)zones { 
    NSLog(@"MapViewController: Update Markers"); 
    // For each zone, show a marker 
    for (Zone* zone in zones) { 
     NSString *keyMarker = [NSString stringWithFormat:@"%d-marker", zone.id]; 

     MKCircle *circle = [overlayCache objectForKey:keyMarker]; 
     if (circle == nil) { 
      // draw the radius circle for the marker 
      double radius = MAX(zone.markerRadius * 1.0, 1.0); 
      circle = [MKCircle circleWithCenterCoordinate:zone.location radius:radius]; 
      [mapView addOverlay:circle]; 
      // store the circle in a cache for future reference 
      [overlayCache setObject:circle forKey:keyMarker]; 
     } 
    } 
} 

código que hace que los puntos de vista de superposición

#pragma mark - 
#pragma mark MKMapViewDelegate 
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay{ 
    MKCircleView *circleView = [[[MKCircleView alloc] initWithCircle:overlay] autorelease]; 
    circleView.lineWidth = 1.0; 
    circleView.strokeColor = [UIColor redColor]; 
    return circleView; 
} 

Código que libera el Caché de superposición

- (void)dealloc { 
    [overlayCache release]; 
    [mapView release]; 
    [super dealloc]; 
} 
+0

curioso qué versión de los iOS esto está sucediendo en. ¿Dónde ves el pico de consumo de memoria en los instrumentos? – Nick

+0

Estoy ejecutando iOS 4.0. La clase MKCircle se agregó en 4.0. Hice algunas pruebas más y parece que solo conduce a problemas graves en un iPhone 3G. 3GS y el simulador funcionan bien. No veo picos en los instrumentos, eso hace que sea difícil investigar esto .. – rule

Respuesta

5

Estoy viendo que ocurre lo mismo. Estoy dibujando MKPolylines en lugar de círculos, pero tengo exactamente el mismo problema. 1 línea funciona bien, pero cuando empiezo a agregar varias y trato de mover el mapa, se bloquea con advertencias de memoria. Pegaría mi código, pero es bastante idéntico al círculo cambiante de la línea anterior.

EDITAR: el problema parece ser que cada superposición crea una nueva capa de animación principal. hay una solución aquí - https://devforums.apple.com/thread/48154?tstart=0 Además, creo que este es un error conocido que debe corregirse en la próxima versión

EDITAR: la solución alternativa: "No es un problema con la API, sino más bien con la implementación. Mi sugerencia consolidar manualmente en una sola es una solución para el momento

por ejemplo, aquí es cómo se puede implementar un MultiPolygon y vista correspondiente:."

@interface MultiPolygon : NSObject <MKOverlay> { 
    NSArray *_polygons; 
    MKMapRect _boundingMapRect; 
} 

- (id)initWithPolygons:(NSArray *)polygons; 
@property (nonatomic, readonly) NSArray *polygons; 

@end 

@implementation MultiPolygon 

@synthesize polygons = _polygons; 

- (id)initWithPolygons:(NSArray *)polygons 
{ 
    if (self = [super init]) { 
     _polygons = [polygons copy]; 

     NSUInteger polyCount = [_polygons count]; 
     if (polyCount) { 
      _boundingMapRect = [[_polygons objectAtIndex:0] boundingMapRect]; 
      NSUInteger i; 
      for (i = 1; i < polyCount; i++) { 
       _boundingMapRect = MKMapRectUnion(_boundingMapRect, [[_polygons objectAtIndex:i] boundingMapRect]); 
      } 
     } 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [_polygons release]; 
    [super dealloc]; 
} 

- (MKMapRect)boundingMapRect 
{ 
    return _boundingMapRect; 
} 

- (CLLocationCoordinate2D)coordinate 
{ 
    return MKCoordinateForMapPoint(MKMapPointMake(MKMapRectGetMidX(_boundingMapRect), MKMapRectGetMidY(_boundingMapRect))); 
} 

@end 



@implementation MultiPolygonView 

- (CGPathRef)polyPath:(MKPolygon *)polygon 
{ 
    MKMapPoint *points = [polygon points]; 
    NSUInteger pointCount = [polygon pointCount]; 
    NSUInteger i; 

    if (pointCount < 3) 
     return NULL; 

    CGMutablePathRef path = CGPathCreateMutable(); 

    for (MKPolygon *interiorPolygon in polygon.interiorPolygons) { 
     CGPathRef interiorPath = [self polyPath:interiorPolygon]; 
     CGPathAddPath(path, NULL, interiorPath); 
     CGPathRelease(interiorPath); 
    } 

    CGPoint relativePoint = [self pointForMapPoint:points[0]]; 
    CGPathMoveToPoint(path, NULL, relativePoint.x, relativePoint.y); 
    for (i = 1; i < pointCount; i++) { 
     relativePoint = [self pointForMapPoint:points[i]]; 
     CGPathAddLineToPoint(path, NULL, relativePoint.x, relativePoint.y); 
    } 

    return path; 
} 

- (void)drawMapRect:(MKMapRect)mapRect 
      zoomScale:(MKZoomScale)zoomScale 
      inContext:(CGContextRef)context 
{ 
    MultiPolygon *multiPolygon = (MultiPolygon *)self.overlay; 
    for (MKPolygon *polygon in multiPolygon.polygons) { 
     CGPathRef path = [self polyPath:polygon]; 
     if (path) { 
      [self applyFillPropertiesToContext:context atZoomScale:zoomScale]; 
      CGContextBeginPath(context); 
      CGContextAddPath(context, path); 
      CGContextDrawPath(context, kCGPathEOFill); 
      [self applyStrokePropertiesToContext:context atZoomScale:zoomScale]; 
      CGContextBeginPath(context); 
      CGContextAddPath(context, path); 
      CGContextStrokePath(context); 
      CGPathRelease(path); 
     } 
    } 
} 

@end 
+0

¡Gracias, voy a intentarlo! – rule

+1

¿Alguna vez se solucionó este error en una versión iOS 4.x? –

+2

Sí, lo arreglaron en 4.1 – clarky

Cuestiones relacionadas