2010-11-01 4 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>

Спасибо заранее, С.

+0

Вместо КВО, почему бы просто не использовать метод didSelectAnnotationView делегата? – Anna

ответ

3

Он работает как исключенный, но некоторое время он получает исключение «EXC_BAD_ACCESS». og выглядит следующим образом, и это показывает мне утечку памяти. ...

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

+0

Тогда нам нужно больше узнать о вашем коде. – zoul

0

Я знаю, что он довольно старый, но я вижу, что этот код много используется для stackoverflow и других репозиториев, и вот решение проблемы.

Вы должны создать Ивар NSMutableArray на ваш взгляд класса контроллера для того, чтобы сохранить ссылку на аннотации просмотра:

MyMapViewController <MKMapViewDelegate> { 
NSMutableArray *annot; 

}

Инициализировать его в viewDidLoad и в вашем - (MKAnnotationView *) mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>) annotation вы должны добавьте MKAnnotationView к самому изменяемому массиву непосредственно перед кодом annView addObserver:

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]; 
Смежные вопросы