2010-11-01 115 views
0

我正在實現基於MKMapView的應用程序。在我點擊一個別針時,我正在使用觀察者。觀察者代碼如下,使用KVO時出現異常

[annView  addObserver:self 
     forKeyPath:@"selected" 
     options:NSKeyValueObservingOptionNew 
     context:@"ANSELECTED"]; 

它正在爲例外,但過一段時間就越來越例外「EXC_BAD_ACCESS」。我的日誌如下,它顯示我泄漏的內存。我需要釋放服務器嗎?如果我 ?那麼我應該在哪裏發佈這個?你們能幫我解決嗎?

An instance 0x1b21f0 of class MKAnnotationView is being deallocated while key value observers are still registered with it. Observation info is being leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info: 

( 語境:0x2b588,物業:0x1acaa0>

由於提前, S.

+0

而是志願的,爲什麼不直接使用didSelectAnnotationView委託方法? – Anna 2010-11-01 18:10:54

回答

3

它工作正常,但有一段時間它得到異常'EXC_BAD_ACCESS'。我的日誌如下,它顯示我泄漏的內存。 ...

An instance 0x1b21f0 of class MKAnnotationView is being deallocated while key value observers are still registered with it. 

這是泄漏的對面。它被解除分配;泄漏是當對象將永遠不會被解除分配時

問題在於它正在被釋放,而其他東西仍然在觀察它。任何仍在觀察該對象的事物也可能在稍後發送其他消息;當它發生時,這些消息將轉到一個死對象(導致您看到的崩潰,這發生在該消息之後)或到另一個對象。

如果觀察MKAnnotationView的對象擁有它並釋放它,它需要在釋放它之前將其自身作爲觀察者移除。如果它不擁有它,它可能應該。

1

你必須停止觀察註解視圖中,釋放它之前:

[annView removeObserver:self forKeyPath:@"selected"]; 
+0

我用過這個,但是仍然有內存異常 – sekhar 2010-11-01 10:07:00

+0

然後我們需要看到更多的代碼。 – zoul 2010-11-01 10:42:06

0

我知道這是相當古老的,但我看到這個代碼在stackoverflow和其他倉庫中使用了很多,這裏是解決問題的辦法。

你應該以存儲到您的註釋的參考在您的視圖控制器類中創建一個NSMutableArray伊娃查看:

MyMapViewController <MKMapViewDelegate> { 
NSMutableArray *annot; 

}

初始化它在你的viewDidLoad中,在你- (MKAnnotationView *) mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>) annotation 你應該在AnnView addObserver代碼之前將MKAnnotationView添加到可變數組本身:

if(nil == annView) { 
    annView = [[MyAnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:identifier]; 
    [annot addObject:annView]; 
} 


[annView addObserver:self 
      forKeyPath:@"selected" 
      options:NSKeyValueObservingOptionNew 
      context:(__bridge void *)(GMAP_ANNOTATION_SELECTED)]; 

然後,在你viewDidDisappear方法,你可以遍歷數組,並手動刪除所有的觀察員

//remove observers from annotation 
for (MKAnnotationView *anView in annot){ 
    [anView removeObserver:self forKeyPath:@"selected"]; 
} 

[annot removeAllObjects]; 

[super viewDidDisappear:animated]; 
相關問題