iPhone dev - делегаты, уведомления, отписаться перед освобождением? - PullRequest
5 голосов
/ 21 августа 2009

В моем вопросе об использовании делегата или события UIControl это было в ответе Кендалла Хельмштеттера Гельна:

Обе имеют примерно равную нагрузку для работы - с делегатом вы должны установить себя, а затем не забыть сбросить себя, прежде чем вас освободят. Вы должны сделать то же самое с уведомлениями, не забудьте начать прослушивание, а затем отменить подписку, прежде чем вас освободят.

Что они имеют в виду, отписаться перед освобождением, сбросить себя? Я не делал что бы то ни было. Может кто-нибудь объяснить, что это такое и как это сделать?

Спасибо !!

Ответы [ 3 ]

8 голосов
/ 21 августа 2009

Вам необходимо удалить себя как делегата, если ваша продолжительность жизни короче объекта, для которого вы делегированы. Почти во всех случаях ваша продолжительность жизни равна или больше, чем объект, для которого вы делегированы. Тем не менее, это хорошая привычка. Рассмотрим случай, когда вы являетесь делегатом для UITableView. В -init, возможно, вы звоните:

self.myTableView.delegate = self;

Тогда было бы мудро в -dealloc сказать

_myTableView.delegate = nil;
[_myTableView release];
_myTableView = nil;

Причина для этого заключается в том, что myTableView может сохраняться другими объектами, поэтому может не освобождаться при его освобождении. Если после вашего отсутствия будет выполнен вызов делегата, ваше приложение будет аварийно завершено. Так что очистка указателя делегата - хорошая идея здесь.

Аналогично для NSNotificationCenter вы должны удалить себя в -dealloc, таким образом:

[[NSNotificationCenter defaultCenter] removeObserver:self];

Это удаляет вас от всех наблюдений. Вы должны сделать это в -dealloc, если ваш класс когда-либо регистрируется для каких-либо уведомлений. Если вы этого не сделаете, и после того, как вы уйдете, появится уведомление, за которым вы наблюдали, приложение упадет.

Это не обязательно для NSTimers, потому что NSTimers сохраняют свою цель (вас).

1 голос
/ 30 декабря 2009

Сохранение не выполняется для цели при передаче в метод addTarget UIControl. Хотя в документации нет конкретного упоминания об этом, я написал простой тест, чтобы доказать этот факт.

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

Это означает, что элемент управления никогда не будет препятствовать освобождению цели .

1 голос
/ 21 августа 2009

Я полагаю, вы просто установите делегата на ноль.

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