addAnnotations problem (zarządzanie pamięcią może?)

głosy
1

Mam pewien problem z MKMapView / adnotacji / UINavigationController. Zasadniczo udaje mi moje poglądy za pomocą UINavigationController; jeden z moim zdaniem zawiera MKMapView i dodawać adnotacje na niej (10 do 200), stosując metodę addAnnotations.

Wszystko działa poprawnie z wyjątkiem jednej rzeczy: jeśli nawigacja „zbyt szybko” na moim UINavigationController, wywala symulatora iPhone, odbierania sygnału „EXC BAD access”. Na przykład, jeśli mogę załadować mój pogląd zawierający MKMapView i natychmiast nacisnąć przycisk „Wstecz” na pasku nawigacyjnym UINavigationController, pojawia się sygnał. Pomyślałem, że problem był z metodą addAnnotations: kiedy moja MKMapView jest załadowany, i dodawanie adnotacji do niego, ale wygląda na to wszystko odbywa się asynchronicznie. Jeśli mogę się doczekać jak sekund przed naciśnięciem przycisku „Wstecz”, otrzymuję żadnego błędu, ale jeśli jestem zbyt szybki, to wywala. Mam żadnego błędu w ogóle, jeśli usunąć wiersz addAnnotations. Myślę, że to dlatego, że mój pogląd jest wydany przez UINavigationController PRZED metoda addAnnotations swoją robotę.

Każdy dobry Rozwiązaniem tego problemu? Nie chcę użytkownikowi czekać (wyświetlanie widoku ładowania na przykład); Myślę, że rozwiązaniem mogłoby być lepsze zarządzanie pamięcią, ale nie widzę w jaki sposób można to zrobić.

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

Na tym przykładzie, otrzymuję „Dodawanie oznaczeń miejsc: done” wiadomość, zanim cokolwiek się wyświetlane na mapie.

Utwórz 07/09/2009 o 17:31
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
5

Wpadłem na tym samym numerze lub błędów, i znalazł rozwiązanie na blogu .

Można sprawdzić, czy to, co widzisz jest taka sama jak w kwestii stanowisko patrząc na ślad debugger stosu.

Problem wynika z faktu realizacji MapViewController (rodzicem MKMapView) został dealloc'd a mapa asynchronicznego pobierania wnętrzności MKMapView próbuje wywołać delegata MKMapView (który był MapViewController).

Tak więc, na dealloc z MapViewController, musisz zresetować MKMapView.delegate = nil tak, że żadne delegaci są nazywane po niektóre płytki się wrócił.

UPDATE: to dobra praktyka (to gdzieś w docs zarządzania pamięcią) do zera delegatów w dealloc przed zwolnieniem uchwyt delegata. Spowoduje to zatrzymanie problemy jak to dzieje na długo uruchomionych zadań async.

Odpowiedział 07/09/2009 o 17:35
źródło użytkownik

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