2012-09-28 22 views
52

¿Alguien más, que está usando mapas en sus aplicaciones iOS 6, nota un uso de memoria extremadamente alto hasta el punto de recibir advertencias de memoria una y otra vez hasta el punto de colapsar la aplicación?iOS6 MKMapView utilizando una tonelada de memoria, hasta el punto de estrellar la aplicación, ¿alguien más lo notó?

He encontré con la aplicación a través de instrumentos y que no estoy viendo cualquier fuga y hasta que se crea la vista del mapa de la aplicación se ejecuta constantemente en torno a ~ 3Mb Bytes vivo. Una vez que se crea el mapa y se descargan las teselas, Live Bytes salta a ~ 13mb Live Bytes. Luego, al mover el mapa y acercar y alejar el Live Bytes, continúo subiendo hasta que la aplicación se cuelga a unos ~40mb Live Bytes. Esto está en un iPhone 4 por cierto. En un iPod touch, se cuelga incluso antes.

estoy reutilizando las vistas de anotación correctamente y no tiene fugas. ¿Alguien más está viendo este mismo alto uso de memoria con los nuevos mapas de iOS 6? Además, ¿alguien tiene una solución?

+0

Creé una aplicación de prueba mínima con nada más que un 'MKMapView' drag n 'caído en ella y veo en el orden de 50-90MB * Live Bytes * (simulador de iPhone 5). De manera similar, Live Bytes altos con otro hardware simulado. Por lo tanto, parece que este es un problema con la biblioteca. http://stackoverflow.com/questions/13340999/guide-to-acceptable-live-bytes-of-ios6-app-using-mkmapview –

Respuesta

23

Después de mucho jugando y probando diferentes ideas, algunas de las cuales se han mencionado aquí, la solución final que trabajó para mí fue como sigue.

  • En lugar de crear nueva de como sea necesario en la aplicación MKMapView, he añadido una propiedad MKMapView a mi AppDelegate y sólo lo creó cuando sea necesario. Una vez que se ha creado, vive en AppDelegate para siempre y reutilizo esa única instancia en todos los lugares necesarios. Esto realmente ayudó a reducir la cantidad de memoria utilizada ya que estaba creando instancias de un par de MKMapView diferentes y ambos se quemaron en la memoria con bastante rapidez.

  • También encontré que iOS 6 Maps maneja la liberación de memoria muy bien una vez que se ha recibido una advertencia de memoria. Sí, consume más memoria mientras hace zoom y panorámica, pero parece responder adecuadamente a las Advertencias de memoria.

  • Lo último que tuve que hacer fue trabajar para reducir mi huella de memoria inicial general. Me di cuenta de que estaba comenzando mucho más arriba de lo que esperaba, lo que también contribuyó a los bloqueos que estaba recibiendo relacionados con la memoria. Una vez que bajé la huella inicial, dejé que MKMapView liberara su memoria durante las advertencias de memoria, y me aseguré de tener solo 1 instancia de MKMapView que pudiera reutilizar en toda la aplicación, todo funciona correctamente.

+0

Si tengo mi configuración 'MKMapView' en un guión gráfico como una de las pantallas de' UITabBarController', ¿cómo harías para colocarla en AppDelegate? ¿Hay alguna manera de hacerlo aún utilizando el guión gráfico, o uno tiene que eliminarlo de allí y luego agregarlo mediante programación? ¿Entonces con alloc, establecer su marco, etc.? – Joseph

+0

Casper, si solo tiene un MKMapView en su aplicación y le permite vivir para siempre en su única ubicación, debería marcar la diferencia si lo tiene en un controlador de vista o en un delegado de la aplicación. Simplemente no cree varias instancias de MKMapView y debería ser bueno. ¿Estás viendo problemas de memoria con tu mapa? –

+0

Después de hacer zoom, pellizcar, etc. en el simulador de iPad mis asignaciones totalizaron 1.84 GB (!) Después de implementar el hot-fix (cambio de mapType en '- (void) didReceiveMemoryWarning') nunca pasó de 200 MB. – Joseph

5

Mi huella era: 2.48; 19.51; 49.64; 12.60 que es: Memoria antes de cargar el mapView, luego de cargar el mapView, luego de acercar/alejar un poco el mapa, y luego de soltar el mapView (lo cual es bastante molesto, incluso después de liberar mapView, guardo un incremento de 10MB y no funciona abajo!)

de todos modos, no estoy usando un IBOutlet para la MapView más, estoy creando todo en código en su lugar. La nueva huella es ahora: 2.48; 19.48; 38.42; 12.54.

Todavía estoy trabajando en poner el bi *** abajo.

+0

Me puedo relacionar totalmente con tu último comentario – Gmeister4

3

Tengo la misma sensación y no sé cómo release esto memory, incluso cuando MKMapView no se utiliza.

He liberado el controlador, MKMapView, vista de contenedor ... memory todavía se utiliza.

no se acuerda de experimentar esto con el viejo MKMapView en iOS5.

8

Experimento el mismo problema.

memoria no se libera después de zoom y cambio de ubicación.

El único truco que he encontrado es para cambiar el tipo de mapa después de la advertencia de memoria.

5
No

una solución sino simplemente un truco ...

... cambiar mapType => Memoria liberación MapKit.

Incluso si este cambio es por una fracción de segundo.

21

También estoy teniendo este problema y me está volviendo loco. Tratando de encontrar una revisión basado en el poste de Mateo, esto es lo que ocurrió:

- (void)applyMapViewMemoryHotFix{ 

    switch (self.mkMapView.mapType) { 
     case MKMapTypeHybrid: 
     { 
      self.mkMapView.mapType = MKMapTypeStandard; 
     } 

      break; 
     case MKMapTypeStandard: 
     { 
      self.mkMapView.mapType = MKMapTypeHybrid; 
     } 

      break; 
     default: 
      break; 
    } 

    [self.mkMapView removeFromSuperview]; 
    self.mkMapView = nil; 
} 

No estoy seguro de por qué, pero la combinación de la eliminación de Superview, y luego poner a cero realmente reduce el uso de memoria. Llamo a este método en la vista de controladorDiscursar.

Otras cosas que lo intentaron, pero sin un efecto significativo:

1) Creación de autoreleasepool alrededor init alloc del MKMapView

2) ajuste mostrado región alrededor de 84 lat lon -30 como pensaba información vectorial en el Ártico puede no ser tan denso ... Sin embargo, no ayuda;)

Este problema es muy grave y hace que nuestra aplicación sea inestable y cause toneladas de advertencias de memoria en iOS 6. Espero que Apple publique una mejor revisión que la mía ... ¡¡pronto!!

favor criticar mi revisión y llegar a métodos más eficaces para reducir el uso de memoria cuando no funcione un mapa. ¡Gracias!

+0

¡Encontrar súper útil, gracias! Solo desearía que liberara toda la memoria. Aún deja una pequeña porción de la memoria asignada por el mapa. – stuckj

+2

Quité la instrucción de cambio y dejé las dos últimas líneas y parece que la memoria está muy bien. –

+7

Por lo que veo, esta corrección no ayuda en iOS 7. MKMapView causa pérdidas de memoria bastante graves. – kal21

2

Recibo mismo problema -

No estoy completamente seguro de esto, pero podría ser que los nuevos mapas de manzana precargas una enorme área del mapa para atender a la navegación fuera de línea?

Si se activa su conexión después el mapa se ha cargado, a continuación, tratar y hacer un zoom sobre áreas muy lejos de la ubicación deseada y luego parece que hay una gran cantidad de detalle todavía disponibles.

2
- (void)applyMapViewMemoryHotFix{ 

    switch (self.mapView.mapType) { 
     case MKMapTypeHybrid: 
     { 
      self.mapView.mapType = MKMapTypeStandard; 
     } 

      break; 
     case MKMapTypeStandard: 
     { 
      self.mapView.mapType = MKMapTypeHybrid; 
     } 

      break; 
     default: 
      break; 
    } 


    self.mapView.mapType = MKMapTypeStandard; 



} 
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    [self applyMapViewMemoryHotFix]; 
} 
+0

Esto funciona como iOs 8.4, pero proporciona un parpadeo de mapa al intercambiar modos de mapa que seguramente disminuirán el UX (experiencia del usuario). –

1

No está seguro acerca de las consecuencias.

Sin embargo, establecer el mapa en 'nil' cuando la vista desaparece, me ayudó a reducir el uso de memoria de ~ 250MB a ~ 50-60MB.

-(void)viewDidDisappear:(BOOL)animated 
{ 
    self.map = nil; 
} 
+0

También agregué esta línea para reducir la memoria. [self.map removeFromSuperview]; – Shashi3456643

2

Para aquellos journerying aquí en 2014+ (iOS8 y hasta)

estoy corriendo en este problema en IOS 7+ tratando de apoyar a los dispositivos más antiguos (piensa Ipad 2 con 512 MB).

Mi solución es deshabilitar Zoom ya que lleva más memoria.

long mem = [NSProcessInfo processInfo].physicalMemory; 
    if(mem < _memory_threshold){ 
     self.MapView.zoomEnabled = NO; 
    } 

He intentado todo lo de conmutación tipos de mapas, para desasignar el mapa, poniendo el delegado a cero, la eliminación de todas las superposiciones, etc. anotaciones

Nada de eso funciona en iOS7 +. De hecho, la mayoría de estas correcciones causan saltos en la memoria, ya que MKMapView parece tener fugas y nunca se trata correctamente (he verificado a través de la subclasificación que veo el hit dealloc).

Esto apesta, pero lo único que he logrado hasta ahora es deshabilitar las características del mapa (zoom, desplazamiento, interacciones del usuario) como medio para limitar la atroz cantidad de memoria que toma MKMapView. Esto ha resultado en que mi aplicación al menos sea semiestable en dispositivos más antiguos.

6

Este problema aún está presente en iOS 9, a menos que lo haga.

Segue hacia y desde un controlador de vista con una vista de mapa que se ha configurado en un tablero de historia provoca un bloqueo (para mí) después de aproximadamente 10-15 mostrar y descartar ciclos.

Ahora parece que la solución es simple. Agregando esto

override func viewDidDisappear(animated: Bool) { 
    super.viewDidDisappear(animated) 
    mapView.removeFromSuperview() 
} 

Parece que se ha solucionado el problema, el ciclo de lata hacia y desde más de 20 veces y sin problemas. ¡¡Sin accidente!!

Espero que esto ayude. Este fue un problema frustrante y está contento de haberlo resuelto.

+1

¡Increíble! Si bien esto apunta claramente a problemas con la implementación de MKMapView de Apple, al llamar "removeFromSuperview" definitivamente se solucionó esto. Tengo una aplicación de aprobación de datos en la que estoy cambiando entre un controlador de pantalla completa con un mapa y una lista de mapas para aprobar; en el pasado solo podía acceder a través de 7-10 mapas antes de que se bloqueara debido a la presión de la memoria. Ahora puedo ir para siempre, y el generador de perfiles demuestra que esta solución funcionó: el uso de RAM se mantiene alrededor de 40MB, mientras que antes, aumentaría en aproximadamente 30-40MB cada vez que abrí el VC con el mapa, hasta chocar. ¡Gracias! – DiscDev

+0

Para iOS 9, esta es la respuesta "correcta". – DiscDev

+0

@ DogCoffee, excelente respuesta! +1 –

Cuestiones relacionadas