При разработке приложения мы можем допускать ошибки, которые могут привести к разного рода ошибкам. Чтобы исправить эти ошибки или недочеты, нам необходимо отладить приложение.
Самая простая отладка использует консоль. Интерпретация информации, представленной в консоли, при сбое приложения или преднамеренной записи информации в консоль, позволяет вам наблюдать и фиксировать сбои вашего кода.
Предположим, вы создали кнопку в пользовательском интерфейсе типа UIButton и выполнили действие в контроллере представления. Теперь вы решили сделать это кнопкой переключения, а затем просто измените следующий код:
//Elder code @IBAction func buttonTapped(_ sender: UIButton) { //Changed code @IBAction func switchToggled(_ sender: UISwitch) { print("Called buttonTapped(_:)") }
К сожалению, вы забыли обновить интерфейс в Main.storyboard. Скомпилируйте и запустите приложение, затем нажмите кнопку. Приложение выйдет из строя, и вы увидите сообщение, записанное на консоль.
2016-08-24 12:52:38.463 Buggy[1961:47078] - [Buggy.ViewController buttonTapped:]: unrecognized selector sent to instance 0x7ff6db708870 2016-08-24 12:52:38.470 Buggy[1961:47078] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Buggy.ViewController buttonTapped:]: unrecognized selector sent to instance 0x7ff6db708870' *** First throw call stack: ... .. . And So on , A long Error
Сообщение в консоли выглядит довольно пугающим и трудным для понимания, но оно не так плохо, как кажется на первый взгляд. Действительно полезная информация находится на самом верху. Начнем с самой первой строчки.
2016-08-24 12:52:38.463 Buggy[1961:47078] - [Buggy.ViewController buttonTapped:]: unrecognized selector sent to instance 0x7ff6db708870
В экземпляр 0x7ff6db708870 отправлена метка времени, имя приложения и нераспознанный селектор оператора. Чтобы понять эту информацию, помните, что приложение iOS может быть написано на Swift, но оно по-прежнему построено на основе Cocoa Touch, которая представляет собой набор фреймворков, написанных на Objective-C.
Objective-C - это динамический язык, и когда сообщение отправляется экземпляру, среда выполнения Objective-C находит фактический метод, который должен быть вызван в это точное время, на основе своего селектора, своего рода идентификатора.
Таким образом, утверждение о том, что нераспознанный селектор [был] отправлен экземпляру 0x7ff6db708870, означает, что приложение пыталось вызвать метод для экземпляра, у которого его не было.
Сообщение в Objective-C всегда заключено в квадратные скобки в форме [селектор приемника]. Короче говоря, эта строка из консоли сообщает вам, что селектор buttonTapped: был отправлен экземпляру Buggy. ViewController, но он не был распознан.
В следующей строке сообщения добавляется информация о том, что приложение было закрыто из-за «неперехваченного исключения», и указывается тип исключения как NSInvalidArgumentException.
Основная часть консольного сообщения - это трассировка стека, список всех функций или методов, которые были вызваны до момента сбоя приложения. Знание того, какой логический путь выбрало приложение до сбоя, может помочь вам воспроизвести и исправить ошибку. Ни один из вызовов в трассировке стека не смог вернуться, и они перечислены с самым последним вызовом наверху. Вот снова трассировка стека:
Каждая строка в списке включает номер вызова, имя модуля, адрес памяти (который мы удалили, чтобы уместить остальные на странице) и символ, представляющий функцию или метод. Если вы просканируете трассировку стека снизу вверх, вы можете почувствовать, что приложение запускается в основной функции Buggy в строке, обозначенной номером вызова 23 (обратите внимание, что ваши номера вызовов могут быть немного другое), получает событие, распознаваемое как прикосновение по номеру вызова 10, а затем пытается отправить соответствующее действие цели кнопки по номеру вызова 8. Селектор для действия не найден (номер вызова 3: - [UIResponder doesNotRecognizeSelector: ]), в результате чего возникает исключение (номер вызова 1: objc_exception_throw).
Хотя эта разбивка сообщения консоли относится к одному типу ошибки из многих возможных, понимание базовой структуры этих сообщений поможет вам разобраться в сообщениях об ошибках, с которыми вы столкнетесь в будущем. По мере накопления опыта вы начнете связывать сообщения об ошибках с типами проблем и станете лучше отлаживать код.
МОЙ LINKEDIN: linkedin.com/in/my-pro-file
Темы, которые могут вас заинтересовать
- Протокол: https://levelup.gitconnected.com/protocols-in-swift-7359a88248b4?source=---------8---------- -------- & gi = b985317da979
- Перечисление: https://levelup.gitconnected.com/enumerations-in-swift-5dd14b4055a7
- Свойства: https://medium.com/dev-genius/what-are-properties-in-swift-2ec8aba9a378
- Структура: https://medium.com/@mdcode2021/what-is-structure-in-swift-ebc22767fe1d