iPhone - экземпляр класса ... освобождается, пока наблюдения значения ключа все еще зарегистрированы в нем - PullRequest
7 голосов
/ 11 января 2010

У меня есть ViewController (с MKMapView), который запихивается из-за NavigationController. Так что у меня есть NavBar с кнопкой «назад». При нажатии на эту кнопку возврата я получаю сообщение об ошибке:

2010-01-11 18: 05: 35.273 TestApp [147: 207] Экземпляр 0x1758f0 класса MKUserLocation освобождается, в то время как наблюдатели значения ключа все еще зарегистрированы в нем. Информация о наблюдениях просачивается и может даже ошибочно присоединиться к какому-либо другому объекту. Установите точку останова на NSKVODeallocateBreak, чтобы остановиться здесь в отладчике. Вот текущая информация наблюдения: ( Контекст: 0x0, Свойство: 0x17d600> ) Программа получила сигнал: «EXC_BAD_ACCESS».

У меня есть метод viewDidLoad, реализованный с помощью Observer:

- (void)viewDidLoad {
    mapView = (MKMapView*)self.view;
    mapView.delegate = self;
    mapView.mapType = MKMapTypeHybrid;
    mapView.showsUserLocation = YES;

    // ...

    [mapView.userLocation addObserver:self forKeyPath:@"location" options:0 context:NULL];
    [super viewDidLoad];

}

Мой сделка:

- (void)dealloc {
    [groupId release];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

Может кто-нибудь сказать мне, что здесь не так? Я нажимаю кнопку «Назад» в NavBar, затем захожу в метод dealloc, а затем он переключается обратно на более высокий ViewController и выдает эту ошибку.

Большое спасибо заранее и наилучшими пожеланиями.

1 Ответ

12 голосов
/ 11 января 2010

Вы устанавливаете и удаляете наблюдателя на разных объектах. Вы добавляете контроллер представления в качестве наблюдателя userLocation в первом примере кода, а затем пытаетесь удалить его из центра уведомлений по умолчанию во втором. Чтобы правильно удалить наблюдателя из userLocation, измените метод -dealloc на следующий:

- (void)dealloc {
    [groupId release];
    [mapView.userLocation removeObserver:self forKeyPath:@"location"];
    [super dealloc];
}
...