Я только недавно заметил сбой в одном из моих приложений, когда объект пытался отправить сообщение своему делегату, а делегат уже был освобожден.
В данный момент, перед вызовом любых методов делегата, я запускаю эту проверку:
if (delegate && [delegate respondsToSelector:...]){
[delegate ...];
}
Но, очевидно, это не учитывается, если делегат не равен нулю, но был освобожден.
Помимо установки делегата объекта равным nil в методе делегата dealloc
, есть способ проверить, был ли делегат уже освобожден, только если у меня больше нет ссылки на объект.