Я знаю, что он довольно старый, но я вижу, что этот код часто используется в 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];