Наблюдатели не удалены - PullRequest
0 голосов
/ 11 марта 2012

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

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

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

1 Ответ

0 голосов
/ 11 марта 2012

Из документов :

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

Если вы подклассировали кнопки, вы можете отправить всем наблюдателям сообщение о том, что наблюдаемая 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, но может быть полезным для других случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...