iPhone MapView / mapKit pomocí removeAnnotation & addAnnotation výsledky v nevracení paměti?

hlasů
1

Aktualizovat umístění ukazatele 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];

... Vidím net paměti pomalu lezení v nástrojů (simulátor). No „Leak“ výkyv, ale „Čisté bajty“ a „# Net“ pomalu postupně ... pokud tento kód je komentář. Takže jsem 100% jistý, to je problematický kód.

Ale pokud bych udělat následující ...

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

... pak je „Čistý bajty“ a „# Net“ zvyšovat mnohem rychleji. Je možné, že to není moje chyba, a snažím se vypátrat netěsnost MapKit? Jsem opravdu netěsní paměti? Opět platí, že nic v části „úniky“ se objeví, ale pak nevidím důvod, proč Čistá hodnota bude neustále lezení.

Díky za každou pomoc, -Gord

Položena 04/02/2010 v 23:34
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
2

Váš vývojový cyklus je špatně:

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. paměť zvýšit vidíte, je to pravděpodobně z annotationVIEWS. Ty jsou uloženy v mezipaměti na mapě. Pokud stále vidíte nárůst mem pravděpodobně váš názor dequeueing je špatně.

PPS. jste v úvahu pouze nastavení nové umístění pro anotaci. Mnohem jednodušší, pokud umístění je jediná věc, která se mění.

myGpsAnnotation.coordinate = region.center;
Odpovězeno 10/03/2011 v 11:55
zdroj uživatelem

hlasů
1

Měli byste nejprve pochopit, jak funguje kolekce.

Přidávání a objekt odběrem ji udržet.
Odebrání objektu z kolekce ji uvolnit.

Ve vašem případě je to view map:


  1. Po přidání poznámky k zobrazení mapy, měli byste jej uvolnit, pokud vlastníte referenci.
  2. Po odstranění poznámku ze zobrazení mapy nepotřebujeme ot uvolněte.

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

A je to. Není třeba se uvolnit zde.

Odpovězeno 04/03/2011 v 08:38
zdroj uživatelem

hlasů
0

Pokud jste sledování tohoto testování, zatímco na simulátoru, neboj se. Zdá se, že mapa kit ukládá mapové dlaždice v paměti při spuštění v simulátoru, zatímco na zařízení, používá SQLite pro ukládání mapových dlaždic a ne omezenou RAM na zařízení.

Odpovězeno 13/02/2010 v 18:29
zdroj uživatelem

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