2013-10-20 9 views
6

Sto usando MKMapView nel mio grande progetto. quando carico un sacco di annotazioni (oltre 700) e disegno una linea tra quei punti su MapKit, ricevo il messaggio di errore xcode "Terminato a causa di un errore di memoria" e l'app si sta bloccando. si può vedere sull'immagine:Come posso risolvere Terminato a causa di un errore di memoria

enter image description here.

sto aggiungendo linea come questa:

enter image description here

se ho meno di 700 annotazione, che sta funzionando molto bene. Sto pensando che abbia qualche problema di memoria. Come posso risolvere questo problema? Qualche consiglio.

// adding annodation 
    for (int i=0; i<[fetcher.locations count]; i++)//fetcher.locations is NSMutableArray and inside have locationInfoClass objects . locationInfoClass is hold CLLocationCoordinate2D. 
     { 
      locationInfoClass * loc=[fetcher2.locations objectAtIndex:i]; 

      CLLocationCoordinate2D coordinate1; 
      coordinate1.latitude = loc.lat; 
      coordinate1.longitude = loc.lon; 

      myAnnotation * ann = [[myAnnotation alloc] initWithCoordinate:annCoordinate   title:@"uniqtitle" subtitle:@"uniqsubtitle"]; 
      [mapView addAnnotation:ann]; 


     } 
     #pragma mark - 
     #pragma mark -mapview overlay 


     CLLocationCoordinate2D *coordinates 
     = malloc(sizeof(CLLocationCoordinate2D) * [mapView.annotations count]); 

     for (int i=0; i<[mapView.annotations count]; i++) { 
      myAnnotation * ann=[mapView.annotations objectAtIndex:i]; 
      coordinates[i]=ann.coordinate; 


     } 


     self.routeLine = [MKPolyline polylineWithCoordinates:coordinates count:mapView.annotations.count]; // pinlerin sayısı ne kadarsa o kadar çizgi çiziyor. 
     free(coordinates); 
     [self.mapView setVisibleMapRect:[self.routeLine boundingMapRect]]; //If you want the route to be visible 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.mapView addOverlay:self.routeLine]; 
     }); 

file h hanno

@property (nonatomic, retain) MKPolyline *routeLine; //your line 
@property (nonatomic, retain) MKPolylineView *routeLineView; //overlay view 

MKMapView metodi delegato.

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay 
{ 
    if(overlay == self.routeLine) 
    { 
     if(nil == self.routeLineView) 
     { 
      self.routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine]; 
      self.routeLineView.fillColor = [UIColor redColor]; 
      self.routeLineView.strokeColor = [UIColor redColor]; 
      self.routeLineView.lineWidth = 3; 

     } 

     return self.routeLineView; 
    } 

    return nil; 
} 
/* 
- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views 
{ 
    MKAnnotationView *annotationView = [views objectAtIndex:0]; 
    id <MKAnnotation> mp = [annotationView annotation]; 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 1500, 1500); 
    [mv setRegion:region animated:YES]; 

}*/ 
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 

    MKAnnotationView *pinView = nil; 
    if(annotation != mapView.userLocation) 
    { 
     static NSString *defaultPinID = @"ftffggf"; 
     pinView = (MKAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
     if (pinView == nil) 
      pinView = [[MKAnnotationView alloc] 
         initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 

     //pinView.pinColor = MKPinAnnotationColorGreen; 
     pinView.canShowCallout = YES; 



     //pinView.animatesDrop = YES; 
     UIImage * image=[UIImage imageNamed:@"pin.png"]; 
     CGSize size=CGSizeMake(50, 63);//set the width and height 
     pinView.image = image 
    } 
    else { 
     [self.mapView.userLocation setTitle:@"I am here"]; 
    } 
    pinView.centerOffset = CGPointMake(0,-23); 
    return pinView; 

} 
+0

questo è l'intero messaggio? senza backtrace o eccezioni? – nielsbot

+0

sì il messaggio è solo questo. l'app è in attesa di 30 secondi per aggiungere annotazioni e aggiungere overlay. improvvisamente questo messaggio sta mostrando. –

+0

Esegui la tua app sotto Strumenti e guarda la crescita della memoria. Se questa è la stessa app della tua altra domanda in cui hai più di 90 thread, questo potrebbe facilmente essere il problema. – bbum

risposta

5

Recentemente - e con crescente frequenza - mi è stato vedere il messaggio stesso errore ("terminato a causa di errore di memoria") ogni volta che ho corso un progetto da XCode, dopo quasi esattamente un minuto di tempo di esecuzione, anche se Non tocco l'app dopo l'avvio.

ero non vedere:

  • Qualsiasi consumo di memoria sorprendente quando eseguito con il profiler.
  • Qualsiasi schema ovvio in cui l'applicazione viene terminata (diverso dal tempo necessario per il verificarsi, ma che ha richiesto un po 'di tempo per riconoscere).
  • Qualsiasi messaggio di errore "Termina un'app a causa dell'eccezione non rilevata" o tracce di stack nella console.
  • Eventuali eccezioni generate (punto di interruzione eccezione, eccezione: tutto; interruzione: in fase di lancio).
  • Qualsiasi oggetto zombi.

Inoltre, ho solo visto l'applicazione esiste in modo imprevisto quando l'applicazione è in esecuzione in di debug - salto non a caso torna a Springboard se mi ri-fatto funzionare l'app dal dispositivo subito dopo è stato terminato.

Stavo per fare una domanda simile, specificando tutti questi dettagli e chiedendo come mai avrei potuto risolvere il problema.

Poi ho avuto un momento d'oh, e ho notato due avvisi di memoria nella console, anche se il profiler non ha mostrato problemi di memoria.

Zombi. Quando ho spento gli oggetti zombi, gli avvisi di memoria sono scomparsi e l'app non è più terminata spontaneamente.

Edit:

10 mesi più tardi, ho trovato un'altra situazione in cui questo può accadere.È venuto fuori, un ciclo infinito while può anche fare questo:

while (result==nil) { 
    result = [collectionView indexPathForItemAtPoint:testPoint]; 
    testPoint = nextTestPoint(); // After about 12 seconds, at which point this is several tens of thousands of pixels off the edge of the screen, the app dies from "Memory error" 
} 
Problemi correlati