iPhone MapView / mapKit χρησιμοποιώντας removeAnnotation & addAnnotation αποτελέσματα στην απώλεια μνήμης;

ψήφοι
1

Για να ενημερώσετε τη θέση του δείκτη GPS για MapView ...

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

... Βλέπω καθαρή μνήμη αργά αναρρίχηση σε Instruments (simulator). Δεν blip «διαρροή», αλλά «Net Bytes» και «# Net» σιγά-σιγά προσαύξηση ... εκτός και αν αυτός ο κώδικας είναι σε σχόλια. Έτσι είμαι 100% σίγουρος ότι και αυτός είναι ο κώδικας υποτροπής.

Αλλά αν κάνετε τα εξής ...

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

... τότε το «Net Bytes» και «# καθαρά» αυξηθεί πολύ πιο γρήγορα. Είναι δυνατόν αυτό δεν είναι λάθος μου, και εγώ προσπαθώ να εντοπίσουμε μια διαρροή στο MapKit; Είμαι πραγματικά διαρροή μνήμης; Και πάλι, τίποτα δεν εμφανίζεται κάτω από «διαρροές», αλλά τότε δεν βλέπω γιατί Καθαρές τιμές θα αναρρίχηση συνεχώς.

Ευχαριστώ για οποιαδήποτε βοήθεια, -Gord

Δημοσιεύθηκε 04/02/2010 στις 23:34
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
2

κύκλο κυκλοφορίας σας είναι λάθος:

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. η μνήμη αυξήσει που βλέπετε είναι ίσως από τις annotationVIEWS. Αυτά αποθηκεύονται προσωρινά από τον χάρτη. Εάν εξακολουθείτε να βλέπετε αύξηση mem κατά πάσα πιθανότητα την άποψή σας dequeueing είναι λάθος.

ΜΑΔ. δεν θα εξετάσει μόνο τη ρύθμιση τη νέα θέση για το σχολιασμό. Πολύ πιο εύκολο αν η τοποθεσία είναι το μόνο πράγμα που αλλάζει.

myGpsAnnotation.coordinate = region.center;
Απαντήθηκε 10/03/2011 στις 11:55
πηγή χρήστη

ψήφοι
1

Θα πρέπει πρώτα να καταλάβουμε πώς λειτουργεί συλλογή.

Προσθέτοντας και το αντικείμενο της συλλογής θα το διατηρήσει.
Αφαίρεση ένα αντικείμενο από τη συλλογή θα κυκλοφορήσει.

Στην περίπτωσή σας είναι μια προβολή χάρτη:


  1. Μετά την προσθήκη του σχολιασμού στην προβολή χάρτη, θα πρέπει να το απελευθερώσει, αν έχετε στην κατοχή σας την αναφορά.
  2. Αφού αφαιρέσετε ένα σχολιασμό από το χάρτη, δεν χρειάζεται ot αφήστε το.

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

Αυτό είναι. Δεν χρειάζεται να απελευθερώσει εδώ.

Απαντήθηκε 04/03/2011 στις 08:38
πηγή χρήστη

ψήφοι
0

Αν παρατηρείτε αυτή τη δοκιμή, ενώ για τον προσομοιωτή, μην ανησυχείτε. Φαίνεται ότι το κιτ χάρτη αποθηκεύει προσωρινά χάρτη κεραμίδια στη μνήμη, όταν εκτελείται στον προσομοιωτή, ενώ στη συσκευή, που χρησιμοποιεί SQLite για αποθήκευση χάρτη κεραμίδια και όχι την περιορισμένη μνήμη RAM της συσκευής.

Απαντήθηκε 13/02/2010 στις 18:29
πηγή χρήστη

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