problema addAnnotations (managementul memoriei, poate?)

voturi
1

Am ceva probleme cu MKMapView / adnotări / UINavigationController. Practic, am gestiona opiniile mele folosind un UINavigationController; unul dintre opinia mea conține o MKMapView și am adăuga adnotări pe ea (10 la 200), folosind metoda addAnnotations.

Totul funcționează bine, cu excepția unui singur lucru: dacă am naviga „prea repede“ pe UINavigationController meu, accidente iPhone Simulator, primind un semnal de „EXC ACCES BAD“. De exemplu, în cazul în care i încărcați punctul meu de vedere care conține MKMapView și apăsați pe butonul Îndată, „Înapoi“ din bara de navigare UINavigationController, am obține semnalul. M-am gândit că problema a fost cu metoda addAnnotations: atunci când este încărcat MKMapView meu, am adăuga adnotări la aceasta, dar se pare că totul se face asincronă. Dacă aștept ca un al doilea înainte de a apăsa butonul „Back“, nu primesc nici o eroare, dar dacă eu sunt prea repede, se blochează. I a lua nici o eroare la toate, dacă am elimina linia addAnnotations. Cred că e pentru că punctul meu de vedere este eliberat de UINavigationController ÎNAINTE metoda addAnnotations a primit treaba.

Orice soluție bună la asta? Nu vreau ca utilizatorul să aștepte (afișarea în vederea încărcare, de exemplu); Cred că soluția ar putea fi o mai bună gestionare a memoriei, dar eu nu văd cum am putea face acest lucru.

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

În acest exemplu, am obține „marcatorii Adăugarea: făcut“ mesaj înainte de orice se afișează pe hartă.

Întrebat 07/09/2009 la 17:31
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
5

Am fugit în aceeași problemă sau o eroare, și a găsit o soluție pe un post pe blog .

Puteți vedea dacă ceea ce vezi este aceeași ca și problema în postul de privirea de la trasarea debugger stivă.

Problema se datorează faptului că MapViewController (părintele MKMapView) a fost dealloc'd și harta async de MKMapView de preluare este structuri interne încearcă să apela delegatul MKMapView (care a fost MapViewController).

Deci, pe dealloc de MapViewController, le-ați luat pentru a reseta MKMapView.delegate = nil, astfel că nu delegații sunt numite după unele plăci se întoarse.

UPDATE: este o bună practică (e undeva în docs de management al memoriei) a delegaților zero la dealloc înainte de eliberarea suportului delegat. Acest lucru se va opri probleme ca acest lucru să se întâmple pentru rularea lung sarcini async.

Publicat 07/09/2009 la 17:35
sursa de către utilizator

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