обрабатывать при обратном вызове освобожденному делегату? - PullRequest
2 голосов
/ 27 апреля 2010

Я реализовал шаблон обратного вызова делегата между двумя классами без сохранения делегата. Но в некоторых случаях делегат освобождается.

(В моем случае ViewController - это объект-делегат, и когда пользователь нажимает кнопку "Назад", чтобы вытолкнуть этот ViewController из стека NavigationController)

Затем метод обратного вызова получает BAD_EXE:

if (self.delegate != nil && [self.delegate respondsToSelector:selector]) {
    [self.delegate performSelector:selector withObject:self withObject:returnObject];
} 

Я знаю, что шаблон делегата-обратного вызова реализован во многих приложениях. Каково ваше решение для этого?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2010

Как правило, делегат всегда должен отсоединять его от своего делегирующего объекта в своем методе dealloc.Таким образом, ваш контроллер представления должен проверить в dealloc, задан ли он как делегат класса делегирования, и, если это так, установить для свойства делегата значение nil.

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

0 голосов
/ 27 апреля 2010

У меня нет объективного знания c, но я думаю, что вам нужно проверить на self.delegate != nil отдельно, например,

if (self.delegate != nil)
{
 if ( [self.delegate respondsToSelector:selector]) 
 {
    [self.delegate performSelector:selector withObject:self withObject:returnObject];
 }
}

О, и лучше всего переназначить делегата, если он равен нулю.

...