При разработке приложения мы можем допускать ошибки, которые могут привести к разного рода ошибкам. Чтобы исправить эти ошибки или недочеты, нам необходимо отладить приложение.

Самая простая отладка использует консоль. Интерпретация информации, представленной в консоли, при сбое приложения или преднамеренной записи информации в консоль, позволяет вам наблюдать и фиксировать сбои вашего кода.

Предположим, вы создали кнопку в пользовательском интерфейсе типа 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

Темы, которые могут вас заинтересовать