memory - iOS6 MKMapView utilizando una tonelada de memoria, hasta el punto de estrellar la aplicación, ¿alguien más lo notó?
memory-management ios6-maps (12)
¿Alguien más, que está usando mapas en sus aplicaciones para 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?
He ejecutado la aplicación a través de los instrumentos y no veo ninguna fuga, y hasta que se cree la vista del mapa, la aplicación se ejecuta de forma constante en ~ 3mb Live Bytes. 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 se está filtrando nada. ¿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?
Después de jugar mucho y probar diferentes ideas, algunas de las cuales fueron mencionadas aquí, la solución final que funcionó para mí fue la siguiente.
En lugar de crear nuevos MKMapView según sea necesario en la aplicación, agregué una propiedad mkMapView a mi AppDelegate y solo la creé cuando la necesité. 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.
Este problema aún está presente en iOS 9, a menos que haga esto.
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. Añadiendo esto
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
mapView.removeFromSuperview()
}
Parece que ha solucionado el problema, el ciclo de lata hacia y desde más de 20 veces, y no hay problema. ¡¡Sin accidente!!
Espero que esto ayude. Este fue un problema frustrante y está contento de haberlo resuelto.
Estoy recibiendo el mismo problema -
No estoy del todo seguro de esto, pero ¿podría ser que los nuevos mapas de manzana precarguen una gran área del mapa para atender la navegación fuera de línea?
Si apaga su conexión después de que el mapa se haya cargado, intente y amplíe las áreas que no están cerca de la ubicación deseada, entonces parece que todavía hay muchos detalles disponibles.
Experimento el mismo problema.
La memoria nunca se libera después del zoom y cambia de ubicación.
El único truco que he encontrado es cambiar el tipo de mapa después de la advertencia de memoria.
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, ya no estoy usando un IBOutlet para MapView, en su lugar estoy creando todo en código. La nueva huella es ahora: 2.48; 19.48; 38.42; 12.54.
Todavía estoy trabajando en poner el bi *** abajo.
No es una solución sino simplemente un truco ...
... cambiar mapType => memoria de liberación de mapkit.
Incluso si este cambio es por una fracción de segundo.
No estoy seguro 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;
}
Solo las siguientes líneas son suficientes para resolver el problema de la memoria:
Para Objective-C:
- (void) applyMapViewMemoryFix {
[self.mkMapView removeFromSuperview];
self.mkMapView = nil;}
Para Swift 3.0:
func applyMapViewMemoryFix() {
mapView.removeFromSuperview()
self.mapView = nil
}
También estoy teniendo este problema y me está volviendo loco. Tratando de descubrir una revisión basada en la publicación de mateo, esto es lo que se me 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 eliminar de superview y luego establecer a nil realmente reduce el uso de memoria. Llamo a este método en la vista de controladorDiscursar.
Otras cosas que intenté pero sin un efecto significativo:
1) Creación de autoreleasepool alrededor de alloc init de mkMapView
2) Configuración de la región mostrada alrededor de lat 84 lon -30, ya que pensé que la información vectorial en el Ártico podría no ser tan densa ... 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!
Critique mi revisión y proponga métodos más efectivos para reducir el uso de memoria al descartar un mapa. ¡Gracias!
Tengo la misma sensación y no sé cómo release
esta memory
, incluso cuando no se utiliza MKMapView
.
He liberado el controlador, MKMapView
, vista de contenedor ... la memory
todavía se usa.
No olvide experimentar esto con MKMapView
antiguo en iOS5.
Para aquellos que viajan aquí en 2014+ (iOS8 y superior)
Me estoy encontrando con este problema en iOS 7+ tratando de admitir dispositivos más antiguos (piense en Ipad 2 con 512MB).
Mi solución es desactivar Zoom ya que lleva más memoria fácilmente.
long mem = [NSProcessInfo processInfo].physicalMemory;
if(mem < _memory_threshold){
self.MapView.zoomEnabled = NO;
}
He intentado todo, desde cambiar los tipos de mapas, hasta la desasignación del mapa, configurar el delegado en cero, eliminar todas las superposiciones, anotaciones, etc.
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 todo lo que he logrado hasta ahora es deshabilitar las características del mapa (zoom, desplazamiento, interacciones del usuario) como un medio para limitar la cantidad atroz de memoria que toma MKMapView. Esto ha resultado en que mi aplicación al menos sea semiestable en dispositivos más antiguos.
- (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];
}