iPhone mapView / mapKit folosind removeAnnotation & addAnnotation rezultate în scurgere de memorie?

voturi
1

Pentru a actualiza locația unui indicator GPS pe mapView ...

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

... Văd memorie net alpinism lent în instrumente (simulator). Nu „scurgere“ blip, dar „Net Bytes“ și „# Net“ încet incrementarea ... cu excepția cazului în acest cod este comentat. Deci, eu sunt 100% sigur acest lucru este codul ofensatoare.

Dar dacă fac următoarele ...

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

... atunci „Net Bytes“ și „# Net“ crește mult mai repede. Este posibil acest lucru nu este greseala mea, iar eu încerc să urmări în jos o scurgere în MapKit? Sunt scurgeri de memorie într-adevăr? Din nou, nimic nu apare sub „Scurgeri“, dar eu nu văd de ce valori nete ar fi alpinism continuu.

Multumesc pentru orice ajutor, -Gord

Întrebat 04/02/2010 la 23:34
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
2

Ciclul dvs. de presă este greșit:

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. memoria crește vedeți este , probabil , de la annotationVIEWS. Acestea sunt memorate în cache de hartă. Dacă vedeți în continuare în creștere , probabil , sig opinia dvs. dequeueing este greșit.

PPS. ai lua în considerare doar stabilirea noua locație pentru adnotarea. Mult mai ușor dacă locația este singurul lucru care se schimbă.

myGpsAnnotation.coordinate = region.center;
Publicat 10/03/2011 la 11:55
sursa de către utilizator

voturi
1

Tu ar trebui să înțeleagă mai întâi cum funcționează de colectare.

Adăugarea și obiecte de colectare se va reține.
Eliminarea unui obiect din colecția va elibera.

In cazul tau este o vizualizare hartă:


  1. După adăugarea adnotarea la vizualizarea hărții, ar trebui să-l elibereze dacă dețineți referință.
  2. După îndepărtarea unei adnotări de la vizualizarea hărții nu au nevoie de ot eliberați.

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

Asta e. Nu este nevoie să elibereze aici.

Publicat 04/03/2011 la 08:38
sursa de către utilizator

voturi
0

Dacă observi această testare în timp ce pe simulator, nu vă faceți griji. Se pare că kit-ul harta cache de hartă, în memorie, atunci când rulează pe simulator în timp ce pe dispozitiv, îl folosește SQLite pentru stocarea de hartă, și nu RAM limitat pe dispozitiv.

Publicat 13/02/2010 la 18:29
sursa de către utilizator

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