Несколько полезных приемов отладки Xcode

Несколькополезныхприемовотладкиxcode

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

⚠️ Если вы пропустили предыдущий пост Несколько полезных трюков lldb Я рекомендую вам проверить это, прежде чем двигаться дальше. В нем подробно объясняются команды lldb, которые я буду использовать в этом посте.

Я буду использовать тот же образец кода, что и в прошлый раз:

  последний класс PhotosViewController: UIViewController, Встраивание {частные данные var: String?  private var isShowingLoading = false override func viewDidLoad () {super.viewDidLoad () if isShowingLoading {embed (LoadingViewController ())} // Имитировать задержку загрузки данных DispatchQueue.main.asyncAfter (deadline: .now () + 1) {   в self? .removeAllEmbedded () if self? .data! = nil {self? .embed (PhotoListViewController ())} else {self? .embed (ErrorViewController ())}}}}  

Сначала я хочу напечатать значение флага функции isShowingLoading и данные:

  (lldb) e print ("IsShowingLoading:  (isShowingLoading) IsDataAvailable:  (data! = nil)") IsShowingLoading: false IsDataAvailable: false  

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

Давайте разместим точку останова где-нибудь в функции viewDidLoad (), то есть в super. viewDidLoad () строка. Вместо запуска приложения мы сначала дважды нажимаем точку останова:

Здесь есть куча интересного. Мы можем установить условие, и точка останова сработает, когда оно встретится, или установить, сколько раз точка останова будет игнорироваться перед остановкой выполнения. Но мы ищем кнопку Добавить действие . Когда мы нажимаем на него:

По умолчанию Команда отладчика – это то, что нам нужно, но я рекомендую вам проверить другие варианты. Вставляем наше печатное выражение в текстовое поле:

Теперь, когда мы открываем PhotosViewController и срабатывает точка останова, мы видим это в консоль:

  IsShowingLoading: false IsDataAvailable: false  

Без изменения кода. Команду можно изменить на лету, и в следующий раз, когда сработает точка останова, она выполнит новую команду. Единственное, что это напрягает. Мы хотим напечатать значения, но останавливаться на этой точке останова – пустая трата времени. Не долго. Когда мы проверяем

Автоматически продолжать после оценки действий , эта точка останова будет выполнять любые команды, которые мы добавьте к нему, но выполнение не остановится:

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

Сначала нам нужно смоделировать, у нас есть данные. Это означает изменение значения данных с помощью выражения. Но на этот раз мы добавляем:

  e self? .Data = "some_data"  

В качестве действия точки останова:

После установки этой точки останова будет показан PhotoListViewController. Если мы решим отключить его, вместо этого мы увидим экран с ошибкой.

Неплохо для одной точки останова с помощью команды lldb.

Первая часть сделана . Сейчас мы показываем PhotoListViewController. Затем мы хотим встроить наш NewPhotoListViewController, чтобы сделать его видимым:

Это должно сработать. Но … этого не произошло. Мы видим PhotoListViewController, а не наш экспериментальный экран. Ранее я сказал, что это потому, что старый экран встроен в новый. Все правда. Но откуда я это узнал? Здесь появляется еще одна замечательная функция Xcode – Иерархия представлений отладки

Мы сделали эту причудливую точку останова с помощью команды, но, к сожалению, у нас она не сработала. Мы предположили, что старый экран закрывает новый, но сначала нам нужно проверить это предположение. Нажмите на значок в области отладки:

Тогда подождите немного. Это будет того стоить. Вот как работает отладка иерархии представлений в Xcode. Виды отображаются в трехмерном пространстве. Мы можем перемещать их, вращать, увеличивать и уменьшать масштаб и решать, какие виды должны быть видны, а какие нет:

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

  thread jump --by 1  

Нам нужно добавить второе действие к нашей точке останова. Откройте точку останова при внедрении и нажмите кнопку «плюс»:

И добавьте вторую команду:

На этот раз сработало отлично. Экран, над которым мы работали, был единственным встроенным, и, наконец, мы можем увидеть его в действии.

Что еще лучше, команды выполняются, когда активна точка останова. Это означает, что когда мы деактивируем его, код будет работать как раньше.

Небольшое напоминание о том, насколько это круто – все это можно сделать без перекомпиляции приложение. Мы можем без промедления переключаться между экранами. Все, что нам нужно сделать, это активировать или деактивировать точку останова.

Нам удалось протестировать наш код проверки концепции без каких-либо изменений в существующих потоках. Но что произойдет, если мы захотим показать свою работу коллеге? Или мы добавили умные точки останова, которые могут помочь другим разработчикам?

Мы можем поделиться своими потрясающими точками останова с другими. Откройте Навигатор точек останова в Project Navigator раздел (или нажмите cmd + 8):

Это список всех точек останова в приложении. Но трудно понять, что есть что, поскольку все они находятся в функции viewDidLoad (). Давайте коснемся точки останова и добавим параметр имени и сделаем то же самое для другого:

Намного лучше:

Когда мы знаем, какая точка останова какая и даже что более важно, любой другой сможет понять, для чего нужны эти точки останова. Мы можем ими поделиться. Откройте окно параметров для точки останова (коснитесь точки останова двумя пальцами) и выберите Поделиться точкой останова .

Когда мы фиксируем изменения в репозитории все будут видеть эти точки останова в Xcode.

Спасибо за чтение!

PS Пример приложения очень прост, и отладчик иерархии представлений может не выглядеть это потрясающе. Вот как это выглядит в более обычном пользовательском интерфейсе:

Leave a comment

Your email address will not be published. Required fields are marked *

two × one =