iPhone mapView / mapKit hjelp removeAnnotation & addAnnotation resultater i minnelekkasje?

stemmer
1

For å oppdatere plasseringen av en GPS-indikator på mapView ...

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

... Jeg ser net minne sakte klatring i Instruments (simulator). Ingen lekkasje blip, men Netto Bytes og # Net sakte økes ... med mindre denne koden er kommentert ut. Så jeg er 100% sikker på at dette er fornærmende.

Men hvis jeg gjør følgende ...

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

... deretter Netto Bytes og # Net øker mye raskere. Er det mulig dette ikke er min feil, og jeg prøver å spore opp en lekkasje i MapKit? Er jeg virkelig lekker minne? Igjen ser ingenting under Lekkasjer, men så ser jeg ikke hvorfor nettoverdier ville bli stadig klatring.

Takk for hjelp, -Gord

Publisert på 04/02/2010 klokken 22:34
kilden bruker
På andre språk...                            


3 svar

stemmer
2

Din utgivelsessyklus er feil:

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. minnet øker du ser er sannsynligvis fra annotationVIEWS. Disse er lagret av kartet. Hvis du fortsatt ser økning i mem sannsynligvis ditt syn dequeueing er galt.

PPS. fikk du vurdere å bare sette ny plassering for merknader. Mye lettere hvis plasseringen er den eneste som endres.

myGpsAnnotation.coordinate = region.center;
Svarte 10/03/2011 kl. 10:55
kilden bruker

stemmer
1

Du bør først forstå hvordan det fungerer samlingen.

Legge og objekt til samlingen vil beholde den.
Fjerne et objekt fra samlingen vil slippe den.

I ditt tilfelle er det et kartutsnitt:


  1. Etter å legge til merknaden til kartvisning, bør du slipper det hvis du eier referansen.
  2. Etter å ha fjernet en merknad fra kartvisning trenger ikke ot slipp den.

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

Det er det. Du trenger ikke å frigi her.

Svarte 04/03/2011 kl. 07:38
kilden bruker

stemmer
0

Hvis du observerer dette mens testing på simulator, ikke bekymre deg. Det virker som om kartet kit cacher kartseksjoner i minnet når du kjører på simulatoren mens på enheten, bruker den SQLite for lagring kartseksjoner og ikke begrenset RAM på enheten.

Svarte 13/02/2010 kl. 17:29
kilden bruker

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