Сбой при удалении себя как наблюдателя - CALayer - PullRequest
0 голосов
/ 22 февраля 2010

У меня происходит сбой в моем подклассе CALayer, когда я удаляю себя как наблюдателя в - (void) dealloc:

- (void)dealloc {
 [[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:@"showColorLabels"];
 [colorLabel release];
 [_color release];
 [super dealloc];
}

Исключение выдается.Это говорит о том, что я не был добавлен в качестве наблюдателя.Это происходит только в определенном случае, после вызова [CATransaction flush].

Я использовал Инструменты, чтобы увидеть, когда объект был выделен.Он говорит, что он был выделен с помощью вызова CALayerGetPresentationLayer ().Я не уверен, как это работает, но я думаю, что это копия моего исходного слоя, поэтому init никогда не вызывался, и меня никогда не добавляли в качестве наблюдателя.

Как я могу проверить, что я -Наблюдатель, прежде чем удалить себя, или, может быть, сказать, если я слой презентации?

Бриджер Максвелл

Ответы [ 2 ]

2 голосов
/ 09 августа 2013

Я нашел хорошее решение здесь: https://stackoverflow.com/a/6714561/958017

вы можете использовать блок try-catch при вызове removeobserver:

@try{
   [[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:@"showColorLabels"];
}@catch(id anException){
   //Whatever you want to do.
}
0 голосов
/ 22 февраля 2010

Welllll .... задать очевидный вопрос в ответ:

Где вы добавляете self в качестве наблюдателя клавиши @"showColorLabels?

Вам не нужно вызывать -removeObserver:forKeyPath:, если вы не добавили объект явно в качестве наблюдателя.

...