2012-03-11 4 views
0

Я добавление кнопок к UITableViewHeader, но получение сообщений консоли, что наблюдатели не были удалены, прежде чем открепления:Наблюдатели не удаляются

Экземпляр 0x4b4750 класса UIButton было высвобождены в то время как значение ключа наблюдатели были еще зарегистрированы это

Это понятно, поэтому я пытаюсь удалить их, но не знаю, как лучше всего это сделать. Единственное, что приходит на ум - это добавить их все в массив, затем в dealloc, пропустить их все и удалить класс, который создал их как наблюдателя. Я не совсем уверен, какие параметры переходить в [[NSNotificationCenter defaultCenter] removeObserver. В каждом заголовке есть три разных кнопки, каждая из которых запускает другой обратный вызов. Означает ли это, что мне понадобится три массива, для каждого вызываемого типа действия, а затем используйте removeTarget?

ответ

0

Из docs:

Важно Центр уведомлений не сохраняет своих наблюдателей, поэтому, вы должны убедиться, что вы разрегистрировать наблюдателей (с помощью removeObserver: или removeObserver: имя: объект :), прежде чем они освобожден. (Если вы этого не сделаете, вы будете генерировать ошибку времени выполнения, если центр посылает сообщение освобожденного объекта.)

Если подклассы кнопки, то вы можете оставить сообщение для всех наблюдателей, что наблюдаемый UIButton собирается идти капут.

[[NSNotificationCenter defaultCenter] postNotificationName:@"UIButton_dealloc" object:self]; 

Или, в классе, который выделяет кнопки после того, как кнопки будут удалены вы можете:

[[NSNotificationCenter defaultCenter] postNotificationName:@"UIButton_dealloc" object:theButton]; 

И объекты наблюдатели, в обоих случаях будет делать это:

// The special event 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething:) name:@"UIButton_event" object:theButton]; 
// The dealloc 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopObserving:) name:@"UIButton_dealloc" object:theButton]; 
.... 
-(void) stopObserving:(NSNotification*)notif { 
    if ([name isEqualToString:@"UIButton_dealloc"]) { 
     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIButton_event" object:object]; 
    } 
} 

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

+0

Я не уверен, как это будет отображаться в контрольных событиях, которые я сейчас использую. Чтобы добавить наблюдателя, я в настоящее время использую 'addTarget', поэтому, если я' addTarget', мне не нужно будет также 'removeTarget'? В любом случае, это массив для отслеживания наилучшего подхода? – Echilon

+0

Я думаю, что это будет, см. Http://cocoawithlove.com/2008/06/five-approaches-to-listening-observing.html для информации наблюдателя –

+0

Это все еще не отвечает, как удалить цель, добавленную в buttn для UIControlEvent. Что бы я передал в качестве параметров 'removeObserver'? – Echilon