2011-11-05 23 views
9

Tengo que crear una aplicación que está destinada a mostrar algunas superposiciones. Las superposiciones están en forma de polígonos con hasta 10000 puntos en el anillo exterior. Pero la gran cantidad de puntos parece no ser el problema aquí. En los últimos días, seguí simplificando mi aplicación solo para encontrarme con una simple Vista que contiene un MapView. La vista está cargada desde un xib (con enchufes y delegados conectados). La superposición se crea dentro del método - (void) mapView: (MKMapView *) mapView regionDidChangeAnimated: (BOOL) animado y agregado a mapView.iOS 5 MapKit se cuelga con superposiciones cuando zoom/pan

La demostración (que está disponible aquí https://github.com/nebucaz/mapkit) muestra un MapView y agrega un triángulo rojo cada vez que se acerca o aleja el mapa. Al jugar alrededor de zoom y panorámica (intensiva y rápida) de MapView, la aplicación falla. Es fácil manipular el simulador, en el dispositivo es mucho más difícil aunque es posible (puedo proporcionar registro de fallos).

Hay dos demos: MapCrash y MapCrashStatic. El primero crea múltiples polígonos alrededor del mapa, dependiendo de dónde se mueva/amplíe. La segunda sólo tiene un único polígono, estática que se crea en - (void) viewDidLoad y luego se añade en cada llamada de MAPview regionDidChangeAnimated

aplicación siempre se estrella con la siguiente traza:

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) 

la Backtrace es siempre igual, se bloquea en el mismo punto en el código de la biblioteca. Analicé con instrumentos (zombis, fugas, asignaciones) y también hice algunas pruebas con objetos retenidos. Supuse que era un problema de memoria, pero aún no podía arrancar Malloc Guard. El bloqueo puede reproducirse en varias máquinas, incluso si acabo de volver a instalar Xcode-tools.

Otras publicaciones en stackoverflow.com también se ocupan de una falla repentina en MapKit, pero no ofrecen ninguna solución directa para mi problema o tuvieron que lidiar con delegados y otros problemas de transición de visualización o inicio/detención de la aplicación. ARC está apagado en mis proyectos.

cazo esta caída durante más de una semana, aún asumiendo que Malinterpreté la KMLViewer Demostración (Apple) o haciendo algo de la manera incorrecta (¡Créditos a otros desarrolladores de iOS en mi vecindario!)

Sin embargo, agradecería sus sugerencias y ayuda en este asunto.

+2

Simplemente para hacer sonar con mi valor de unos pocos centavos, actualmente tengo exactamente el mismo problema. Tengo un NSMutableArray que contiene una lista de objetos que admiten el protocolo MKOverlay.Si se elimina un objeto en la matriz mutable, también se elimina de la vista de mapa. Sin embargo, cuando hago zoom varias veces, se produce el siguiente seguimiento de la pila: – Diziet

+1

'No se puede acceder a la memoria en la dirección 0x1 (gdb) donde # 0 0x00000001 en ??() # 1 0x011a741c en CGPathCreateMutableCopyByTransformingPath() # 2 0x01220d23 en CGContextAddPath() # 3 0x003be3e1 en MKMapRectRemainder() # 4 0x003be498 en MKMapRectRemainder() # 5 0x003cab01 en MKTilesRequireGoogleLegalNotices() # 6 0x029f3c17 en - [CALayer drawInContext:]() # 7 0x02a107e3 en tiled_layer_render() # 8 0x0292b127 en CAImageProviderThread() # 9 0x021804e6 en _dispatch_worker_thread2() # 10 0x9c981b24 en _pthread_wqthread() # 11 0x9c9836fe en start_wqthread() ' – Diziet

+2

Gracias @ Diziet para compartir Abrí una TSI en Apple Developer Network la semana pasada y luego me pidieron que presentara un error. Me dijeron que no hay ninguna solución disponible en este momento y que el error será investigado. Publicaré más comentarios sobre el progreso. – Snel

Respuesta

3

Probablemente ya haya pensado en esto, pero he visto numerosos crashers de aspecto distintivo de MapKit, todos ellos derivados de no anular el delegado. Solo asegúrese de configurar el delegado de la vista de mapa en cero antes de liberarlo.

Además, he visto varios desarrolladores inclinados a utilizar performSelector: afterDelay: en su vista de mapa. Eso está bien siempre y cuando ponga una llamada de forma de cancelación en los lugares correctos también.

+0

Tanques @David para compartir sus pensamientos. En mi ejemplo, realmente me olvidé de configurar el delegado del mapView en nil antes de liberarlo. Nunca pensé en esto, porque el mapa se cuelga mientras se usa y dibuja el mapa. Actualicé el ejemplo con 'self.theMapView.delegate = nil; [self.theMapView release]; self.theMapView = nil; 'El código de ejemplo nunca hace' performSelector'. Por ahora, el choque persiste. – Snel

0

elimine el método zoomToPolyLine y use mapViewDidUpdateLocation para ampliar la línea de polilíneas.