Сбой из-за того, что по умолчанию для объекта, который получает нераспознанный селектор, выбрасывается исключение.
А если у вас нет блока @try / @catch, который перехватывает исключение, необработанныйисключение приводит к прекращению работы приложения.
Однако вы можете изменить это поведение по умолчанию, переопределив методы, обрабатывающие нераспознанный селектор. Проверьте эти методы NSObject :
- forwardingTargetForSelector:
- resolInstanceMethodDynamically:
- forwardInvocation:
- didNotRecognizeSelector:
Здесь также есть хорошая статья Майка Эша здесь , которая дает хорошую общую сводку.
Разница, которую покупает динамизм, заключается в том, что вы генерируете исключение для нераспознанного селектора, который позволяет вам решить, как реагировать на ошибку (вместо немедленного выхода из-за ошибки сегментации).Вы также можете переопределить, как объекты реагируют на нераспознанные селекторы.Однако вы хотите, чтобы они генерировали исключения в большинстве случаев, потому что обычно это признак того, что вы сделали что-то не так.