iPhone mapView / mapKit behulp removeAnnotation & addAnnotation resultaten in geheugenlek?

stemmen
1

Om de locatie van een GPS-indicator op mapView te werken ...

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

... Ik zie net geheugen langzaam klimmen in Instruments (simulator). Nee Leak blip, maar Net Bytes en # Net langzaam ophogen ... tenzij deze code is uitgecommentarieerd. Dus ik ben 100% zeker dat dit is de gewraakte code.

Maar als ik het volgende doen ...

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

... dan is de Net Bytes en # Net veel sneller toenemen. Is het mogelijk dit is niet mijn fout, en ik ben op zoek naar sporen van een lek in MapKit? Ben ik echt lekt geheugen? Nogmaals, verschijnt er niets onder lekken, maar dan heb ik zie niet in waarom Net waarden voortdurend zou klimmen.

Bedankt voor alle hulp, -Gord

De vraag is gesteld op 04/02/2010 om 23:34
bron van user
In andere talen...                            


3 antwoorden

stemmen
2

Uw release-cyclus is verkeerd:

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. het geheugen uitbreiden je ziet is waarschijnlijk uit de annotationVIEWS. Deze worden in de cache van de kaart. Als u nog steeds zie de toename in mem waarschijnlijk uw uitzicht dequeueing is verkeerd.

PPS. heb je bedenkt het instellen van de nieuwe locatie voor de aantekening. Veel gemakkelijker als de locatie is het enige dat verandert.

myGpsAnnotation.coordinate = region.center;
antwoordde op 10/03/2011 om 11:55
bron van user

stemmen
1

U moet eerst begrijpen hoe collectie werkt.

Toevoegen en object collectie zal behouden.
Een object uit collectie zal het vrij te geven.

In uw geval is het een kaartweergave:


  1. Na het toevoegen van de annotatie naar de kaartweergave, moet u deze vrij te geven als je de referentie bezitten.
  2. Na het verwijderen van een aantekening van de kaart- hoeft niet ot deze te ontgrendelen.

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

Dat is het. Geen behoefte om hier vrij te geven.

antwoordde op 04/03/2011 om 08:38
bron van user

stemmen
0

Als u bekijken deze tijdens het testen op de simulator, maak je geen zorgen. Het lijkt erop dat de kaart kit caches kaarttegels geheugen wanneer op de simulator, terwijl het apparaat, gebruikt voor het opslaan SQLite kaarttegels en niet het beperkte geheugen van het apparaat.

antwoordde op 13/02/2010 om 18:29
bron van user

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