2011-11-05 7 views
9

Ho creato un'app che ha lo scopo di visualizzare alcuni overlay. Gli overlay sono in forma di poligoni con un massimo di 10000 punti nell'anello esterno. Ma l'alto numero di punti sembra non essere il problema qui. Negli ultimi giorni ho continuato a semplificare la mia app solo per trovarmi con una semplice vista contenente un MapView. La vista è caricata da un xib (con punti vendita e delegati connessi). L'overlay viene creato all'interno del metodo - (void) mapView: (MKMapView *) mapView regionDidChangeAnimated: (BOOL) animato e aggiunto a mapView.iOS 5 MapKit si blocca con sovrapposizioni quando zoom/pan

La dimostrazione (disponibile qui https://github.com/nebucaz/mapkit) mostra un MapView e aggiunge un triangolo rosso ogni volta che la mappa viene ingrandita, rimossa o spostata. Quando si gioca intorno allo zoom e al panning (intensivamente e velocemente) di MapView, l'app si arresta in modo anomalo. È facile caricare il simulatore, sul dispositivo è molto più difficile anche se è possibile (posso fornire registro di crash).

Esistono due demo: MapCrash e MapCrashStatic. Il primo crea più poligoni attorno alla mappa a seconda di dove si esegue la panoramica/lo zoom. Il secondo ha solo un unico poligono, statica che si crea in - (vuoto) viewDidLoad e poi viene aggiunto a ogni chiamata di mapview regionDidChangeAnimated

App blocca sempre con la seguente backtrace:

Attaching to process 8745. 
MapCrash(8745) malloc: protecting edges 
[Switching to process 8745 thread 0x1820b] 
[Switching to process 8745 thread 0x1820b] 
(gdb) backtrace 
#0 0x00000000 in ??() 
#1 0x00e81a60 in CG::Path::apply_transform() 
#2 0x00ed741c in CGPathCreateMutableCopyByTransformingPath() 
#3 0x00f50d23 in CGContextAddPath() 
#4 0x000f11dc in MKRoadWidthAtZoomScale() 
#5 0x000ee498 in MKMapRectRemainder() 
#6 0x000fab01 in MKTilesRequireGoogleLegalNotices() 
#7 0x02723c17 in -[CALayer drawInContext:]() 
#8 0x027407e3 in tiled_layer_render() 
#9 0x0265b127 in CAImageProviderThread() 
#10 0x01eb04e6 in _dispatch_worker_thread2() 
#11 0x98f44b24 in _pthread_wqthread() 
#12 0x98f466fe in start_wqthread() 
(gdb) 

il Backtrace è sempre lo stesso, si blocca nello stesso punto nel codice della libreria. Ho analizzato con gli strumenti (zombi, perdite, allocazioni) e ho anche fatto dei test con oggetti sovra-trattenuti. Supponevo che fosse un problema di memoria, ma non ero ancora in grado di avviare Malloc Guard. L'arresto anomalo potrebbe essere riprodotto su più macchine, anche se ho appena reinstallato Xcode-tools.

Altri post su stackoverflow.com si occupano anche di un arresto improvviso di MapKit, ma non offrono alcuna soluzione diretta per il mio problema o hanno dovuto occuparsi di delegati e altri problemi di transizione di visualizzazione o di avvio/arresto dell'applicazione. ARC è spento nei miei progetti.

Io do la caccia questo incidente per più di una settimana, ancora assumendo che ho interpretato male il KMLViewer Demo (Apple) o fare qualcosa nel modo sbagliato (Crediti ad altri sviluppatori iOS nel mio quartiere!)

Tuttavia, gradirei i vostri suggerimenti e l'aiuto in questa materia.

+2

Solo per rispondere con i miei pochi centesimi, attualmente ho esattamente lo stesso problema. Possiedo un NSMutableArray che contiene un elenco di oggetti che supportano il protocollo MKOverlay.Se un oggetto nell'array mutabile viene rimosso, viene rimosso anche da mapview. Tuttavia, quando eseguo lo zoom ripetutamente, si verifica la seguente traccia dello stack: – Diziet

+1

'Impossibile accedere alla memoria all'indirizzo 0x1 (gdb) dove # 0 0x00000001 in ??() # 1 0x011a741c a CGPathCreateMutableCopyByTransformingPath() # 2 0x01220d23 a CGContextAddPath() # 3 0x003be3e1 a MKMapRectRemainder() # 4 0x003be498 a MKMapRectRemainder() # 5 0x003cab01 a MKTilesRequireGoogleLegalNotices() # 6 0x029f3c17 a - [CALayer drawInContext:]() # 7 0x02a107e3 a tiled_layer_render() # 8 0x0292b127 a CAImageProviderThread() # 9 0x021804e6 a _dispatch_worker_thread2() # 10 0x9c981b24 a _pthread_wqthread() # 11 0x9c9836fe a start_wqthread() ' – Diziet

+2

Grazie @ Diziet per la condivisione. Ho aperto una TSI su Apple Developer Network la scorsa settimana e mi è stato chiesto di presentare un bug. Mi è stato detto che al momento non ci sono soluzioni alternative e che il bug verrà esaminato. Pubblicherò ulteriori commenti sui progressi. – Snel

risposta

3

Probabilmente ci hai già pensato, ma ho visto numerosi crasher distinti di MapKit che derivano dal non rilasciare il delegato. Assicurati di impostare il delegato della visualizzazione della mappa su zero prima di rilasciarlo.

Inoltre, ho visto un numero di sviluppatori inclini a utilizzare performSelector: afterDelay: sulla loro visualizzazione mappa. Va bene fino a quando metti una chiamata a mano perfetta anche nei posti giusti.

+0

Tanks @David per condividere i tuoi pensieri. Nel mio esempio ho davvero mancato di impostare il delegato di mapView su zero prima di rilasciarlo. Non ci ho mai pensato, perché la mappa si blocca mentre viene utilizzata e traccia la mappa. Ho aggiornato l'esempio con 'self.theMapView.delegate = nil; [self.theMapView release]; self.theMapView = nil; 'Il codice di esempio non esegue mai un' performSelector'. Per ora, lo schianto persiste. – Snel

0

rimuovere il metodo zoomToPolyLine e utilizzare mapViewDidUpdateLocation per ingrandire la linea poligonale.