iPhone MapView / MapKit utilizzando removeAnnotation & AddAnnotation risultati in perdita di memoria?

voti
1

Per aggiornare la posizione di un indicatore di GPS sulla MapView ...

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

... Vedo memoria arrampicata su rete lentamente Instruments (simulatore). No blip Leak, ma Net Byte e # Net incrementando lentamente ... a meno che questo codice è commentato. Quindi sono sicuro al 100% questo è il codice incriminato.

Ma se faccio la seguente ...

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

... poi la rete Byte e # Net aumentare molto più velocemente. E 'possibile questo non è il mio errore, e sto cercando di rintracciare una perdita nel MapKit? Sto davvero che perde la memoria? Anche in questo caso, nulla appare sotto fughe di notizie, ma poi non vedo il motivo per cui i valori netti sarebbero continuamente arrampicata.

Grazie per qualsiasi aiuto, -Gord

È pubblicato 04/02/2010 alle 23:34
fonte dall'utente
In altre lingue...                            


3 risposte

voti
2

Il tuo ciclo di rilascio è sbagliata:

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. aumentare la memoria che si vede è probabilmente dalle annotationVIEWS. Questi vengono memorizzati nella cache dalla mappa. Se si vede ancora in aumento mem probabilmente la vostra vista dequeueing è sbagliato.

PPS. lo si considera solo l'impostazione della nuova posizione per l'annotazione. Molto più facile se la posizione è l'unica cosa che cambia.

myGpsAnnotation.coordinate = region.center;
Risposto il 10/03/2011 a 11:55
fonte dall'utente

voti
1

Si dovrebbe prima capire come funziona la raccolta.

Aggiunta e oggetto da collezione sarà conservarlo.
Rimozione di un oggetto da collezione sarà rilasciarlo.

Nel tuo caso si tratta di una guarda la mappa:


  1. Dopo aver aggiunto l'annotazione alla cartina, si dovrebbe rilasciarlo se si possiede il riferimento.
  2. Dopo aver rimosso un'annotazione da guarda la mappa non è necessario ot rilasciarlo.

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

Questo è tutto. Non c'è bisogno di rilasciare qui.

Risposto il 04/03/2011 a 08:38
fonte dall'utente

voti
0

Se si sta osservando questo test, mentre sul simulatore, non ti preoccupare. Sembra che il kit cartina memorizza tiles in memoria durante l'esecuzione sul simulatore mentre sul dispositivo, utilizza SQLite per memorizzare tiles e non la RAM limitata sul dispositivo.

Risposto il 13/02/2010 a 18:29
fonte dall'utente

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