iPhone mapView / MapKit mit RemoveAnnotation & AddAnnotation Ergebnisse in Speicherleck?

stimmen
1

So aktualisieren Sie die Position eines GPS-Anzeige auf mapView ...

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

... Ich sehe langsam Netto-Speicher in Instruments (Simulator) klettern. No Leak Blip, aber Net Bytes und # Net langsam erhöht wird ... es sei denn, dieser Code als Kommentar gekennzeichnet. Also ich bin 100% sicher, dies ist der säumige Code.

Aber wenn ich die folgende ...

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

... dann ist das „Net Bytes“ und „# Net“ viel schneller erhöhen. Ist es möglich, das ist nicht mein Fehler, und ich versuche, ein Leck in MapKit aufzuspüren? Bin ich wirklich Speicher undicht? Auch hier scheint nichts unter „Leaks“, aber dann würde ich sehe nicht, warum Nettowerte steigen ständig werden.

Vielen Dank für jede Hilfe, -Gord

Veröffentlicht am 04/02/2010 um 23:34
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
2

Ihr Release-Zyklus ist falsch:

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. der Speicher erhöhen Sie sehen , sind wahrscheinlich von dem annotationVIEWS. Diese werden von der Karte zwischengespeichert. Wenn Sie noch Erhöhung sehen in mem wahrscheinlich Ihre Ansicht Warteschlangenauflösungs ist falsch.

PPS. Hielten Sie nur den neuen Standort für die Anmerkung zu setzen. Viel einfacher, wenn der Standort das einzige, was sich ändert.

myGpsAnnotation.coordinate = region.center;
Beantwortet am 10/03/2011 um 11:55
quelle vom benutzer

stimmen
1

Sie sollten zuerst verstehen, wie Sammlung funktioniert.

Hinzufügen und Objekt - Kollektion wird es behalten.
Ein Objekt aus der Sammlung entfernen , wird es freigeben.

In Ihrem Fall ist es eine Kartenansicht:


  1. Nach dem Hinzufügen der Anmerkungsansicht abzubilden, sollten Sie es freigeben, wenn Sie die Referenz besitzen.
  2. eine Anmerkung von Kartenansicht Nach dem Entfernen müssen ot es nicht loslassen.

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

Das ist es. Keine Notwendigkeit zu lösen hier.

Beantwortet am 04/03/2011 um 08:38
quelle vom benutzer

stimmen
0

Wenn Sie diese während des Tests auf dem Simulator beobachten, keine Sorge. Es scheint, dass die Karte Kit Kartenkacheln im Speicher-Caches, wenn während auf dem Gerät auf dem Simulator einsetzen, SQLite verwendet für Kartenkacheln zu speichern und nicht die begrenzte RAM auf dem Gerät.

Beantwortet am 13/02/2010 um 18:29
quelle vom benutzer

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