Давненько не писал ничего интересного и решил исправить ситуацию. Люблю делиться тем, чего сам совсем недавно узнал и попробовал на практике. И сегодня мы поговорим об LLDB в Xcode, а в частности про команду expr.
Как часто мы тестируем какие-либо кейсы бизнес-логики в наших приложениях? Как часто мы хардкодим ветки if, только для того, чтобы зайти в эту ветку и посмотреть поведение приложения? И как часто, мы перекомпилируем наш проект? Очень огромное количество раз!
В этом случае нам может помочь как раз команда expr, если поставить breakepoint в нужном вам месте кода. Приведу реальный кейс:
В контроллере у нас лежит какая-либо UIView, при переходе в этот контроллер, мы хотим посмотреть на UIView в разных состояниях, к примеру разного цвета. Для того, чтобы это сделать, вы, наверное, каждый раз меняли цвет у view и пересобирали проект. Но можно это сделать гораздо быстрее и проще. Достаточно поставить брейкпоинт во viewDidLoad и выполнить в LLDB консоли следущую команду:
затем
В конечном результате мы меняем цвет нашей view буквально на лету! Хотя, буквально сейчас узнал еще от друга еще один способ менять свойства UI эелементов. Это найти во UI дебаггере нашу view, скопировать ее адрес и уже используя адрес модифицировать вьюху. Но команда expr умеет гораздо больше!
Двигаемся дальше. Приведу еще один пример, нечто гораздо больше. Снова ставим брэйкпоинт во viewDidLoad в каком либо контроллере и выполним команду:
затем
После этого нас перекинет на тот экран, который мы указали :) Впечатляет, не правда ли?
Следующий пример. У нас есть несколько кейсов, выполняющих разные действия, точнее какой-нибудь switch или ветки с if/else. Опять же, для того, чтобы зайти насильно в какой либо case или ветку if мы будем хардкодить в коде и пересобирать проект? Не нужно! Снова ставим breakpoint, допустим, перед выполнением swith или начало ветки if.
Представим, что dataIsReady у нас будет NO и мы это знаем. Выполним следущее после того как мы попадем в брейкпоинт:
затем
После этого, мы переходим в ту ветку if, которая нам нужна :)
Приведу следущую возможность команды expr. Выполнение методов и создание переменных.
Выводим в лог сообщение:
Проверяем массив на содержание объекта:
Распечатываем frame нашей view:
Стоит отметить “–” указывает, что мы хотим выполнить фактическую команду.
Создание переменных осуществляется следующим способом:
Ключевым символом создания переменной является “$”.
И последний пример. Пишем и выполняем код на лету:
На этом все. Надеюсь вам пригодится данная фича LLDB и вы будете ее активно использовать. Спасибо за внимание! :)