addAnnotations Ausgabe (Speicherverwaltung vielleicht?)

stimmen
1

Ich habe ein Problem mit MKMapView / Anmerkungen / UINavigationController. Im Grunde genommen, ich verwalten meine Ansichten, die eine UINavigationController verwenden; eine meiner Ansicht enthält einen MKMapView und i Annotationen auf sie (10 bis 200), um die addAnnotations Methode.

Alles funktioniert gut, außer für eine Sache: Wenn ich „zu schnell“ auf meinem UINavigationController navigieren, dem iPhone Simulator abstürzt, ein „EXC BAD ACCESS“ Signal empfängt. Zum Beispiel, wenn ich meine Ansicht lade die MKMapView und sofort drücken Sie die Schaltfläche „Zurück“ aus der UINavigationController Navigationsleiste enthält, erhalte ich das Signal. Ich dachte ich, dass das Problem mit der addAnnotations Methode war: wenn mein MKMapView geladen wird, i Anmerkungen hinzufügen, um es, aber es sieht aus wie alles asynchron erfolgt. Wenn ich wie eine zweite warten, bevor die Schaltfläche „Zurück“ drücken, erhalte ich keinen Fehler, aber wenn ich zu schnell bin, stürzt es. Ich bekomme keinen Fehler überhaupt, wenn ich die addAnnotations Linie entfernen. Ich denke, es ist, weil meiner Ansicht nach durch die UINavigationController freigegeben wird, bevor die addAnnotations Methode den Job zu erledigen habe.

Jede gute Lösung für dieses? Ich will nicht der Benutzer warten (eine Lade Ansicht zum Beispiel der Anzeige); Ich denke, die Lösung könnte eine bessere Speicherverwaltung sein, aber ich sehe nicht, wie ich dies tun könnte.

    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); }

An diesem Beispiel habe ich die „Hinzufügen von Ortsmarken: done“ -Meldung, bevor irgendetwas auf der Karte angezeigt bekommen.

Veröffentlicht am 07/09/2009 um 17:31
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
5

Ich lief in das gleiche Problem oder Fehler, und eine Lösung auf einem gefundenen Blogeintrag .

Sie können sehen, ob das, was Sie sehen, das gleiche wie das Problem in der Post ist durch im Debugger-Stack-Trace suchen.

Das Problem ist, aufgrund der Tatsache, der MapViewController (die Eltern des MKMapView) dealloc'd wurde und die Asynchron-Karte Interna von MKMapView holen versucht, die Delegierten von MKMapView zu nennen (was MapViewController).

Also, auf dealloc von MapViewController, du hast die MKMapView.delegate = nil zurückgesetzt werden, so dass keine Delegierten aufgerufen werden, nachdem einige Fliesen zurückgegeben.

UPDATE: es ist gute Praxis (es ist irgendwo in der docs Speicherverwaltung) auf Null Delegierten in dealloc vor den Delegierten Halter freigibt. Dies wird für langen Lauf async Aufgaben geschehen Probleme wie diese zu stoppen.

Beantwortet am 07/09/2009 um 17:35
quelle vom benutzer

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