iPhone MapView / mapKit użyciu removeAnnotation & addAnnotation wyników w wycieku pamięci?

głosy
1

Aby zaktualizować lokalizację wskaźnika GPS na MapView ...

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

... Widzę pamięć netto powoli wspina się Instruments (symulator). Nie „Przeciek” blip, ale „Bajty netto” i „# Net” powoli zwiększając ... chyba że ten kod jest komentarzem. Więc jestem w 100% pewien, że to jest kod naruszającym przepisy.

Ale jeśli wykonaj następujące czynności ...

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

... a następnie „Bajty netto” i „# Net” zwiększy znacznie szybciej. Czy to możliwe, to nie jest mój błąd, i próbuję wyśledzić przeciek w MapKit? Ja naprawdę wyciek pamięci? Ponownie, nic pod „przecieków” pojawia się, ale nie widzę dlaczego wartości netto byłby stale wspinaczki.

Dzięki za pomoc, -Gord

Utwórz 04/02/2010 o 23:34
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
2

Twój cykl wydawniczy jest źle:

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. pamięć zwiększyć widzisz to prawdopodobnie z annotationVIEWS. Te są buforowane przez mapę. Jeśli nadal pojawia się wzrost w mem prawdopodobnie twój widok dequeueing jest źle.

PPS. brałeś pod uwagę tylko ustawiając nową lokalizację dla adnotacji. Znacznie łatwiejsze, jeśli lokalizacja jest jedyną rzeczą, która się nie zmienia.

myGpsAnnotation.coordinate = region.center;
Odpowiedział 10/03/2011 o 11:55
źródło użytkownik

głosy
1

należy najpierw zrozumieć, jak działa kolekcja.

Dodawanie i obiekt do kolekcji będzie go utrzymać.
Usuwanie obiektu z kolekcji będzie ją zwolnić.

W Twoim przypadku jest to mapa:


  1. Po dodaniu adnotacji do widoku mapy, należy zwolnić, jeżeli jesteś właścicielem odniesienia.
  2. Po usunięciu adnotację z widoku mapy nie trzeba ot ją zwolnić.

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

to jest to! Nie ma potrzeby, aby zwolnić tutaj.

Odpowiedział 04/03/2011 o 08:38
źródło użytkownik

głosy
0

Jeśli obserwujemy to testowanie podczas gdy na symulatorze, nie martw się. Wydaje się, że zestaw map mapa płytki buforuje w pamięci podczas pracy na symulatorze, podczas gdy na urządzeniu, wykorzystuje SQLite do przechowywania map i płytek nie ograniczonej pamięci RAM urządzenia.

Odpowiedział 13/02/2010 o 18:29
źródło użytkownik

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