θέμα addAnnotations (διαχείριση μνήμης ίσως;)

ψήφοι
1

Αντιμετωπίζω κάποιο πρόβλημα με MKMapView / σχόλια / UINavigationController. Βασικά, εγώ διαχειρίζονται τις απόψεις μου χρησιμοποιώντας ένα UINavigationController? μία άποψη μου περιέχει MKMapView και μπορώ να προσθέσω σχόλια σε αυτό (10 έως 200), χρησιμοποιώντας τη μέθοδο addAnnotations.

Τα πάντα λειτουργούν καλά εκτός από ένα πράγμα: αν μπορώ να περιηγηθείτε «πολύ γρήγορα» για UINavigationController μου, τις συντριβές προσομοιωτή iphone, λαμβάνει ένα σήμα «EXC BAD ΠΡΟΣΒΑΣΗ». Για παράδειγμα, αν μπορώ να φορτώσει την άποψή μου, που περιέχει το MKMapView και χωρίς καθυστέρηση, πατήστε το κουμπί «Πίσω» από τη γραμμή πλοήγησης UINavigationController, να πάρω το σήμα. Σκέφτηκα ότι το πρόβλημα ήταν με τη μέθοδο addAnnotations: όταν είναι φορτωμένο MKMapView μου, μπορώ να προσθέσω σχόλια σε αυτό, αλλά μοιάζει με όλα γίνονται ασύγχρονα. Αν περιμένω σαν ένα δευτερόλεπτο πριν το πάτημα του κουμπιού «Πίσω», να πάρω κανένα λάθος, αλλά αν είμαι πάρα πολύ γρήγορα, συντρίβει. Έχω κανένα λάθος σε όλα, αν μπορώ να αφαιρέσετε τη γραμμή addAnnotations. Υποθέτω ότι είναι επειδή την άποψή μου, απελευθερώνεται από την UINavigationController πριν η μέθοδος addAnnotations πήρε το έργο μου.

Κάθε καλή λύση σε αυτό; Δεν θέλω ο χρήστης να περιμένει (εμφανίζοντας μια άποψη φόρτωσης για παράδειγμα)? Υποθέτω ότι η λύση θα μπορούσε να είναι μια καλύτερη διαχείριση μνήμης, αλλά δεν βλέπω πώς θα μπορούσα να το κάνουμε αυτό.

    if(DEBUG_MODE) { NSLog(@Creating array of placemarks : begin); }
self.placemarkCache = [[NSMutableArray alloc] init];
// Loading placemarks for a placemark dictionary
NSArray *sortedKeys = [[self.placemarkDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
for (id key in sortedKeys) {
    MyPlacemark *currentPlacemark = [self.placemarkDictionary objectForKey:key];
    [self.placemarkCache addObject:currentPlacemark];
    [currentPlacemark release];
}
if(DEBUG_MODE) { NSLog(@Creating array of placemarks : done); }
if(DEBUG_MODE) { NSLog(@Adding placemarks : begin); }
[self.mapView addAnnotations:self.placemarkCache];
if(DEBUG_MODE) { NSLog(@Adding placemarks : done); }

Σε αυτό το παράδειγμα, παίρνω τα «Προσθήκη σημάνσεις: γίνεται» μήνυμα πριν από οτιδήποτε να εμφανίζονται στο χάρτη.

Δημοσιεύθηκε 07/09/2009 στις 17:31
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
5

Έτρεξα στο ίδιο θέμα ή σφάλμα, και βρήκε μια λύση σε ένα post στο blog .

Μπορείτε να δείτε αν αυτό που βλέπουμε είναι το ίδιο με το θέμα στη θέση του κοιτάζοντας το ίχνος εντοπισμού σφαλμάτων στοίβας.

Το ζήτημα οφείλεται στο γεγονός ότι το MapViewController (η μητρική της MKMapView) έχει dealloc'd και ο χάρτης ασύγχρονη ανάκτηση εσωτερικά της MKMapView προσπαθεί να καλέσει τον εκπρόσωπο της MKMapView (η οποία ήταν MapViewController).

Έτσι, για dealloc της MapViewController, έχετε να επαναφέρετε το MKMapView.delegate = μηδέν, έτσι ώστε να μην αντιπρόσωποι που ονομάζεται μετά από να πάρει μερικά κεραμίδια επέστρεψε.

UPDATE: είναι καλή πρακτική (είναι κάπου στη docs διαχείριση μνήμης) χωρίς να δεχτεί γκολ αντιπροσώπους στο dealloc πριν από την απελευθέρωση του κατόχου εκπρόσωπος. Αυτό θα σταματήσει προβλήματα όπως αυτό συμβεί για πολύ την εκτέλεση εργασιών ασύγχρονη.

Απαντήθηκε 07/09/2009 στις 17:35
πηγή χρήστη

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