iPhone Mapview / MapKit en utilisant les résultats removeAnnotation & AddAnnotation en fuite de mémoire?

voix
1

Pour mettre à jour l'emplacement d'un indicateur GPS sur Mapview ...

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

... Je vois la mémoire nette escalade lentement Instruments (simulateur). Non « fuite » blip, mais « Bytes Net » et « # Net » incrémenter lentement ... à moins que ce code est commenté. Je suis 100% certain que c'est le code incriminé.

Mais si je fais ce qui suit ...

[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];

... alors le « Bytes net » et « # Net » augmenter beaucoup plus rapidement. Est-il possible que ce n'est pas mon erreur, et je suis en train de traquer une fuite dans MapKit? Suis-je vraiment une fuite mémoire? Encore une fois, rien n'apparaît sous la rubrique « Fuites », mais je ne vois pas pourquoi les valeurs nettes seraient sans cesse de grimper.

Merci pour toute aide, -Gord

Créé 04/02/2010 à 23:34
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
2

Votre cycle de sortie est erroné:

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)

PS. la mémoire que vous voyez est probablement augmenter des annotationVIEWS. Ceux - ci sont mises en cache par la carte. Si vous voyez toujours augmentation mem probablement votre point de vue dequeueing est erroné.

PPS. avez-vous envisagé la mise juste le nouvel emplacement pour l'annotation. Beaucoup plus facile si l'emplacement est la seule chose qui change.

myGpsAnnotation.coordinate = region.center;
Créé 10/03/2011 à 11:55
source utilisateur

voix
1

Vous devez d'abord comprendre comment fonctionne la collecte.

Ajout et objet à la collecte va conserver.
Suppression d' un objet de collection va libérer.

Dans votre cas, il est une vue sur la carte:


  1. Après avoir ajouté l'annotation à la carte vue, vous devez libérer si vous possédez la référence.
  2. Après avoir retiré une annotation de la vue carte ne ont pas besoin ot libérer.

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

C'est tout. Pas besoin de libérer ici.

Créé 04/03/2011 à 08:38
source utilisateur

voix
0

Si vous observez ce test while sur le simulateur, ne vous inquiétez pas. Il semble que le kit carte met en cache les tuiles de carte en mémoire lors de l'exécution sur le simulateur tout sur l'appareil, il utilise SQLite pour stocker les tuiles de carte et non la RAM limitée sur l'appareil.

Créé 13/02/2010 à 18:29
source utilisateur

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