iPhone MAPview / MapKit usando removeAnnotation y addAnnotation resultados en la pérdida de memoria?

votos
1

Para actualizar la ubicación de un indicador GPS en MAPview ...

[mapView removeAnnotation:myGpsAnnotation];
[myGpsAnnotation release];
myGpsAnnotation = nil;
myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS];
[mapView addAnnotation:myGpsAnnotation];

... Veo la memoria neta subiendo lentamente en Instrumentos (simulador). Sin blip fugas, pero Net Bytes y # Net incrementando lentamente ... a menos que este código está comentado. Así que estoy 100% seguro de que este es el código erróneo.

Pero si lo hago la siguiente ...

[mapView removeAnnotation:myGpsAnnotation];
[myGpsAnnotation release];
myGpsAnnotation = nil;
myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS];
[mapView addAnnotation:myGpsAnnotation];
[mapView removeAnnotation:myGpsAnnotation];
[mapView addAnnotation:myGpsAnnotation];
[mapView removeAnnotation:myGpsAnnotation];
[mapView addAnnotation:myGpsAnnotation];

... entonces la red Bytes y # Net aumentar mucho más rápido. ¿Es posible que esto no es mi error, y estoy tratando de localizar una fuga en MapKit? ¿De verdad estoy perdiendo memoria? Una vez más, no aparece nada en fugas, pero entonces no veo por qué los valores netos estarían subiendo continuamente.

Gracias por cualquier ayuda, -Gord

Publicado el 04/02/2010 a las 23:34
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
2

Su ciclo de lanzamiento es incorrecto:

myGpsAnnotation = [[MapLocationAnnotation alloc] initWithCoordinate:region.center annotationType:MapAnnotationTypeGps title:MAP_ANNOTATION_TYPE_GPS]; 
//retain count = 1

[mapView addAnnotation:myGpsAnnotation]; 
//retain count = 2 (the map does an extra retain)

[myGpsAnnotation release]; 
//retain count = 1
myGpsAnnotation = nil; //not really necessary

[mapView removeAnnotation:myGpsAnnotation]; 
//retain count = 0 -> dump (you can do this on the original place; I put it here to show the cycle)

PD. aumentar la memoria que se ve es probablemente de los annotationVIEWS. Estos se almacenan en caché por el mapa. Si todavía ve aumento de mem probablemente su vista desencolado es erróneo.

PPS. Qué se tiene en cuenta sólo la creación de la nueva ubicación de la anotación. Mucho más fácil si la ubicación es la única cosa que cambia.

myGpsAnnotation.coordinate = region.center;
Respondida el 10/03/2011 a las 11:55
fuente por usuario

votos
1

Primero debe entender cómo funciona la colección.

Adición y objeto de colección lo retendrá.
La eliminación de un objeto de la colección lo dará a conocer.

En su caso se trata de una vista de mapa:


  1. Después de añadir la anotación a la vista del mapa, debe liberarlo si usted es dueño de la referencia.
  2. Después de la eliminación de una anotación de vista de mapa no necesitan ot liberarlo.

 MyClass *obj=[[MClass alloc] init];
 [mapview addObject:obj];
 [obj release];
 ...
 [mapview removeAnnotation:obj];

Eso es. No hay necesidad de liberar aquí.

Respondida el 04/03/2011 a las 08:38
fuente por usuario

votos
0

Si está observando esta prueba, mientras que en el simulador, no se preocupe. Parece que el kit de memorias caché de mapa mosaicos de mapas en la memoria cuando se ejecuta en el simulador, mientras que en el dispositivo, que utiliza SQLite para almacenar fichas de mapa, y no la memoria RAM limitada en el dispositivo.

Respondida el 13/02/2010 a las 18:29
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more