2010-07-30 11 views
6

Sto lavorando a un'applicazione per iPhone che mostra una mappa con sovrapposizioni di più cerchi in determinate posizioni. Sto correndo in gravi problemi di memoria e si blocca quando aggiungo più di 6 cerchi e faccio lo zoom indietro abbastanza da renderli tutti visibili. Quando eseguo lo zoom in modo che siano visibili solo 2 cerchi, tutto è a posto. Quando rimuovo MKOverlays, tutto funziona correttamente.Più MKOverlay su MKMapView portano ad avvertimenti di memoria

Chi riconosce questo comportamento?

Codice che crea le sovrapposizioni. I memorizzare le sovrapposizioni in un NSMutableDictionary per riferimenti futuri (per essere in grado di rimuoverli dalla mappa e ad evitare la doppia sovrapposizioni)

- (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]; 
     } 
    } 
} 

codice che rende le viste sovrapposte

#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; 
} 

codice che rilascia la overlay cache

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

Curioso quale versione di iOS questo sta accadendo su. Dove vedi il picco di consumo di memoria negli strumenti? – Nick

+0

Sto utilizzando iOS 4.0. La classe MKCircle è stata aggiunta alla 4.0. Ho fatto un po 'di test e sembra che porti a seri problemi su un iPhone 3G. 3GS e il simulatore funzionano bene. Non vedo spuntoni negli strumenti, il che rende difficile indagare su questo .. – rule

risposta

5

Sto vedendo accadere la stessa cosa. Sto disegnando MKPolylines invece di cerchi, ma ho esattamente lo stesso problema. 1 linea funziona bene, ma quando comincio ad aggiungere diversi e provo a spostare la mappa attorno ad esso si blocca con gli avvertimenti di memoria. Incollerei il mio codice, ma è praticamente identico al precedente cerchio che cambia per la linea.

MODIFICA: il problema sembra essere che ogni sovrapposizione crea un nuovo livello dell'anima core. c'è una soluzione qui - https://devforums.apple.com/thread/48154?tstart=0 Inoltre, credo che questo sia un bug noto che dovrebbe essere corretto nella prossima versione

MODIFICA: la soluzione alternativa: "Non è un problema con l'API ma piuttosto l'implementazione. a loro di consolidare manualmente in un unico è una soluzione per il momento

ad esempio, ecco come si potrebbe implementare un multipoligono e vista corrispondente:."

@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

Grazie, proverò a risolvere il problema! – rule

+1

Questo errore è stato risolto in una versione di iOS 4.x? –

+2

Sì, lo hanno risolto in 4.1 – clarky

Problemi correlati