2011-09-01 12 views
6

Mam kontroler widoku z krytym MKMapView że nazywaMKMapView awarii aplikacji, gdy kontroler widoku pojawiło

[self.mapView setRegion:region animated:YES]; 

która zmieniła położenie mapę z punktu A do B.

Sterownik widok, który posiada MKMapView jest ustawiona jako delegat aw

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 

mam jakiś kod, który wywoła kolejną setRegion: animowane: do MKMapView tak, że mapa będzie powiększać się na nowej pozycji automatycznie.

Wszystko działa dobrze, jeśli popViewControllerAnimated: kontroler widoku PO animacji MKMapView odbywa się panoramowanie i powiększanie.

Jednak, gdy próbuję popViewControllerAnimated: bieżący kontroler widoku WHILE, gdy MKMapView jest uruchomiony animacji, aplikacja zawiesza się z "wiadomość wysłana do zwolnionej instancji".

Z wyglądu debuggera, myślę, że MKMapView próbuje wywołać metodę ze zdeponowanego i zwolnionego delegata.

Więc próbowałem

[self.mapView setDelegate:nil]; 
self.mapView = nil; 

w viewDidUnload bez powodzenia. Aplikacja nadal ulega awarii. Jedyną rzeczą, o której mogłem myśleć było stworzenie oddzielnej nowej klasy delegatów i zachowanie tej klasy z nadrzędnego kontrolera widoku, tak aby MKMapView miał delegata do wywoływania, nawet gdy kontroler widoku, który go zawiera, został zwolniony.

Dlaczego tak się dzieje? Czy są jakieś inne "czyste" opcje?

+0

To jest interesujące. Nasza aplikacja jest okaleczana przez kłopotliwe awarie, które występują, gdy MKMapView wywołuje delegata, aby uzyskać widok na adnotację. Problem polega na tym, że w tym punkcie nie ma już MKMapView; albo nie powinno być. Kontroler, który go zawierał, już dawno został złamany. Ciekawe, czy to ten sam problem. – Oscar

+1

Wygląda na ten sam problem: http://stackoverflow.com/questions/2188098/why-am-i-crashing-after-mkmapview-is-freed-if-im-no-longer-using-it – Oscar

Odpowiedz

14

Znajomy pomógł mi uzyskać ten.

Zaimplementowałem własną metodę wyświetlania kontrolera widoku zamiast używać domyślnego przycisku nawigacyjnego kontrolera nawigacyjnego. Właśnie musiałem dodać [self.mapView setDelegate: nil]; zanim zdjąłem kontroler widoku.

- (void)goBack 
{ 
    [self.mapView setDelegate:nil]; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+3

It nie można było tego zrobić w viewWillDisappear? – Oscar

+0

+100 Zaoszczędził mi mnóstwo czasu! – Tomasz

+0

Szalenie Apple. – jowie

8

OK, to jest prawdziwa odpowiedź. Jest z dokumentu Apple, ale brakuje go w MKMapView. Znajduje się on tylko w dokumentacji dla swojego protokołu delegata:

"Przed zwolnieniem obiektu MKMapView, dla którego ustawiono delegata, należy pamiętać o ustawieniu właściwości delegata tego obiektu na zero.Jednym miejscem, w którym można to zrobić, jest metoda dealloc gdzie pozbędziesz się widoku mapy. "

UWAGA: Dotyczy to również interfejsu UIWebView.

Ustawiam wskaźnik delegujący MapView na zero w dealloc metody delegata i wydaje się, że nasze awarie zostały wyeliminowane.

+0

Odnosi się to do obiektu _any_, który może żyć dłużej niż jego uczestnik. –

-1

Poniższy kod jest prawdopodobnie asolve problemu:

-(void) viewWillDisappear:(BOOL)animated 
{ 
    self.mapView.delegate = nil; 
    mapView=Nil; 
    NSLog(@"viewWillDisappear"); 

} 
+0

Zapomniałeś nazwać super metodę viewWillDisappear: animated – Neru

0

Mój problem nie został rozwiązany przez ustawienie delegata MKMapView do zera moim zdaniem kontrolera

[self.mapView setDelegate: nil ];

Musiałem zrobić __strong odwołanie mojego UIViewController zawierający MKMapView w moim RootViewController.

__strong < # UIViewController #> * vcNewLocation;

Powiązane problemy