Пример. Я пишу следующую строку в моем старом проекте и в новом, чистом:

UIInterfaceOrientation k = [UIApplication sharedApplication].statusBarOrientation;

Консольный ввод-вывод для понятного проекта:

(lldb) po k
UIInterfaceOrientationLandscapeLeft

И что-то ужасное в моем старом проекте, если я напишу «po k» - список бесполезных целых чисел.

Кроме того, я не могу распечатать большинство объектов в новом проекте.

14
Vyachaslav Gerchicov 2 Мар 2015 в 12:33

9 ответов

Лучший ответ
Strip debug symbols during copy

В большинстве ответов они советуют установить оптимизацию на «нет», но забывают, что этот параметр должен быть установлен на NO (по крайней мере, для конфигурации отладки).

-2
Vyachaslav Gerchicov 2 Мар 2015 в 12:22
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
0
CrazyPro007 14 Июн 2019 в 05:03

Вроде разница в отладчике lldb / gdb. Единственный способ сделать отладчик более работоспособным для проекта iOS - expr @import UIKit. Но это может не работать для старых версий xcode и ... вам нужно вводить эту строку в консоль после каждого перезапуска. Единственный способ автоматизировать это - установить дополнительную точку останова с этим выражением.

0
Vyachaslav Gerchicov 14 Сен 2015 в 07:58

UIInterfaceOrientation не объект (Objective-C), а целое число (enum:NSInteger). Вам вообще не следует использовать po (print object ).

0
Amin Negm-Awad 2 Мар 2015 в 11:45

po пытается рассматривать то, что вы хотите напечатать, как объект. Во многих случаях он похож на p, но есть случаи, когда возникает разница.

Самый простой способ увидеть разницу: сравнить вывод p 0 и po 0.

(lldb) p 0
  (int) $26 = 0
(lldb) po 0
  <nil>
1
auspicious99 19 Апр 2020 в 06:24
  • Используйте po, p и v для печати переменных
    • po завершает компиляцию и выполнение дважды: один раз для оценки вашего выражения и еще раз для получения описания объекта.
    • v вообще не компилируется: не может вычислять какое-либо выражение, но разрешает доступ к свойствам и выполняет рекурсивное разрешение динамических типов, поэтому каждое свойство обрабатывается как фактический тип среды выполнения.

enter image description here

Для людей, которые хотят узнать больше: https://developer.apple.com/ videos / play / wwdc2019 / 429 /

Добавьте это как ответ для наглядности, также объясняет функциональность каждой команды отладки

1
Gihan 4 Фев 2020 в 19:53

p = печать

po = объект печати

p печатает значение примитивной переменной или значение ссылки

po попытайтесь вызвать -описание для этого объекта и распечатать возвращенную строку

16
Thafer Shahin 7 Июн 2017 в 07:51

Я не знаю, что происходит в вашем случае, но люди ясно понимают разницу между po и p:

Команда p (также известная как expr --) принимает переданные ей аргументы, компилирует их, как если бы они были выражением исходного кода, написанным в контексте текущего кадра, выполняет результат - либо путем запуска интерпретатора на результате компиляции, если это возможно, или путем JIT-обработки результата компиляции, вставки его в целевую программу и ее запуска там. Затем он распечатывает результат оценки.

Команда po (также известная как expr --O --) делает все, что делает p, но вместо печати результата, если результат является указателем на объект ObjC, она вызывает "описание" этого объекта. метод и печатает строку, возвращаемую этим методом (*). Точно так же, если результатом является объект CF, он вызовет CFShow и распечатает результат. Если обе эти попытки потерпят неудачу, он продолжит и напечатает результат, как если бы p.

Так что po в основном похож на p. Но вы можете получить некоторые странные результаты, если используете po для вещей, которые на самом деле не являются объектами. Например, ObjC имеет оптимизацию (помеченные указатели), которые представляют содержимое некоторых объектов (например, NSNumbers) в указателе объекта. Нет «настоящего» объекта, только приготовленный указатель. Поэтому, если вы попытаетесь po целое число, которое просто выглядит как помеченный указатель, вы получите описание некоторого, возможно, несвязанного объекта ObjC, а не значение целого числа.

И, конечно же, po выполняет гораздо больше работы, поэтому, если вы действительно не хотите, чтобы какое-то описание объекта само по себе, p более эффективно.

  • Фактически, он вызывает debugDescription, если он существует, и возвращается к описанию, если его нет ...
23
Jim Ingham 3 Мар 2015 в 21:04

Это относится к тому, что сказал Джим Ингхэм. Введите «p» вместо «po». Когда я это сделаю, Xcode отобразит правильную информацию. Попробуй это.

-2
Trieu Nguyen 13 Сен 2015 в 20:22