2011-09-01 92 views
6

我有與調用的MKMapView崩潰的應用時的視圖控制器彈出

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

其重新定位在地圖從A到B

其保持的MKMapView被設置爲視圖控制器一個的MKMapView視圖控制器委託和

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

我有一些代碼,會觸發另一個setRegion:動畫:到的MKMapView如此,地圖將自動放大新的位置。

一切工作正常,如果我popViewControllerAnimated:視圖控制器後,MKMapView動畫完成平移和縮放。

但是,當我嘗試popViewControllerAnimated:當前視圖控制器WHILE MKMapView運行它的動畫時,應用程序崩潰與「消息發送到釋放實例」。

從調試器的外觀來看,我認爲MKMapView試圖從彈出和釋放的委託調用方法。

所以我在viewDidUnload試圖

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

沒有運氣。該應用程序仍然一直崩潰。

我唯一能想到的就是創建一個單獨的新委託類,並從父視圖控制器中保留該類,以便MKMapView有一個委託即使在包含它的視圖控制器被釋放後也可以調用。

這是怎麼發生的? 有沒有其他的「乾淨」選項?

+0

這很有趣。我們的應用程序被MKMapView調用委託以獲取註釋視圖時發生的令人困惑的崩潰而癱瘓。問題在於那時沒有MKMapView存在;或者不應該有。包含它的控制器早已被彈出。不知道是否是同樣的問題。 – Oscar

+1

看起來像這樣的問題:http://stackoverflow.com/questions/2188098/why-am-i-crashing-after-mkmapview-is-freed-if-im-no-longer-using-it – Oscar

回答

14

朋友幫我弄到了這個。

我實現了我自己的方法來彈出視圖控制器,而不是使用默認導航控制器的後退按鈕。我只需要添加[self.mapView setDelegate:nil];在我彈出視圖控制器之前。

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

它是不可能做到這一點viewWillDisappear? – Oscar

+0

+100它爲我節省了很多時間! – Tomasz

+0

瘋狂的蘋果。 – jowie

8

好的,這是真正的答案。它來自蘋果文檔,但它從MKMapView中丟失。只有在其代理協議的文檔中才能找到它:

「在釋放已設置委託的MKMapView對象之前,請記住將該對象的委託屬性設置爲nil。一個可以執行此操作的位置在dealloc方法中你在那裏處理地圖視圖。「

注意:這也適用於UIWebView。

我在代理的dealloc方法中將MapView的委託指針設置爲nil,並且我們的崩潰似乎已被消除。

+0

這適用於可能比其代表壽命更長的_any_對象。 –

-1

下面的代碼很可能asolve您的問題:

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

} 
+0

你忘了調用viewWillDisappear的超級方法:animated – Neru

0

我的問題是不是由我的視圖控制器

[self.mapView setDelegate設定的MKMapView的委託來解決無:無]。

我不得不在我的RootViewController中對包含MKMapView的UIViewController進行__strong引用。

__strong <#UIViewController#> * vcNewLocation;

相關問題