Пример. Я пишу следующую строку в моем старом проекте и в новом, чистом:
UIInterfaceOrientation k = [UIApplication sharedApplication].statusBarOrientation;
Консольный ввод-вывод для понятного проекта:
(lldb) po k
UIInterfaceOrientationLandscapeLeft
И что-то ужасное в моем старом проекте, если я напишу «po k» - список бесполезных целых чисел.
Кроме того, я не могу распечатать большинство объектов в новом проекте.
9 ответов
Strip debug symbols during copy
В большинстве ответов они советуют установить оптимизацию на «нет», но забывают, что этот параметр должен быть установлен на NO (по крайней мере, для конфигурации отладки).
p prints value of primitive variable or value of a reference
po try to call -description for that object and print returned string
There is also **v command** in lldb. Explaining using example.
protocol Activity {}
struct Trip: Activity {
var name: String
var destinations: [String]
}
let cruise: Activity = Trip(...)
Using v command
(lldb) v cruise.name
(string) cruise.name = "print name"
//As it uses dynamic resolution
Using p command
(lldb) p cruise.name
//execution interrupted
Вроде разница в отладчике lldb / gdb. Единственный способ сделать отладчик более работоспособным для проекта iOS - expr @import UIKit
. Но это может не работать для старых версий xcode и ... вам нужно вводить эту строку в консоль после каждого перезапуска. Единственный способ автоматизировать это - установить дополнительную точку останова с этим выражением.
UIInterfaceOrientation
не объект (Objective-C), а целое число (enum:NSInteger
). Вам вообще не следует использовать po
(print object ).
po
пытается рассматривать то, что вы хотите напечатать, как объект. Во многих случаях он похож на p
, но есть случаи, когда возникает разница.
Самый простой способ увидеть разницу: сравнить вывод p 0
и po 0
.
(lldb) p 0
(int) $26 = 0
(lldb) po 0
<nil>
- Используйте po, p и v для печати переменных
- po завершает компиляцию и выполнение дважды: один раз для оценки вашего выражения и еще раз для получения описания объекта.
- v вообще не компилируется: не может вычислять какое-либо выражение, но разрешает доступ к свойствам и выполняет рекурсивное разрешение динамических типов, поэтому каждое свойство обрабатывается как фактический тип среды выполнения.
Для людей, которые хотят узнать больше: https://developer.apple.com/ videos / play / wwdc2019 / 429 /
Добавьте это как ответ для наглядности, также объясняет функциональность каждой команды отладки
p
= печать
po
= объект печати
p
печатает значение примитивной переменной или значение ссылки
po
попытайтесь вызвать -описание для этого объекта и распечатать возвращенную строку
Я не знаю, что происходит в вашем случае, но люди ясно понимают разницу между po
и p
:
Команда p
(также известная как expr --
) принимает переданные ей аргументы, компилирует их, как если бы они были выражением исходного кода, написанным в контексте текущего кадра, выполняет результат - либо путем запуска интерпретатора на результате компиляции, если это возможно, или путем JIT-обработки результата компиляции, вставки его в целевую программу и ее запуска там. Затем он распечатывает результат оценки.
Команда po
(также известная как expr --O --
) делает все, что делает p
, но вместо печати результата, если результат является указателем на объект ObjC, она вызывает "описание" этого объекта. метод и печатает строку, возвращаемую этим методом (*). Точно так же, если результатом является объект CF, он вызовет CFShow и распечатает результат. Если обе эти попытки потерпят неудачу, он продолжит и напечатает результат, как если бы p
.
Так что po
в основном похож на p
. Но вы можете получить некоторые странные результаты, если используете po
для вещей, которые на самом деле не являются объектами. Например, ObjC имеет оптимизацию (помеченные указатели), которые представляют содержимое некоторых объектов (например, NSNumbers) в указателе объекта. Нет «настоящего» объекта, только приготовленный указатель. Поэтому, если вы попытаетесь po
целое число, которое просто выглядит как помеченный указатель, вы получите описание некоторого, возможно, несвязанного объекта ObjC, а не значение целого числа.
И, конечно же, po
выполняет гораздо больше работы, поэтому, если вы действительно не хотите, чтобы какое-то описание объекта само по себе, p
более эффективно.
- Фактически, он вызывает debugDescription, если он существует, и возвращается к описанию, если его нет ...
Это относится к тому, что сказал Джим Ингхэм. Введите «p» вместо «po». Когда я это сделаю, Xcode отобразит правильную информацию. Попробуй это.
Похожие вопросы
Связанные вопросы
Новые вопросы
objective-c
Этот тег следует использовать только для вопросов, касающихся функций Objective-C или зависящих от кода на языке. Теги [cocoa] и [cocoa-touch] следует использовать, чтобы узнать о фреймворках или классах Apple. Используйте связанные теги [ios], [macos], [apple-watch] и [tvos] для проблем, характерных для этих платформ.