你真的了解p、po、v区别吗

iOS,Xcode,LLDB

Posted by Karim on June 1, 2020

正文

平常在使用Xcode断点调试问题时,po可能是最常用到的LLVM命令了。
通过po命令,我们可以在Xcode的LLDB控制台打印对象的描述,系统在运行时会提供一个默认值,如图:

我们可以通过重写func debugDescription()达到我们希望在po的时候返回预期的返回值。

po的底层逻辑实现:

事实上打印对象有三种方法,po只是其中一种。

第二种方式是p

ppo的区别在于,p不会随着func debugDescription()方法修改而且改变打印的值。

但是ppo,遵循swift的语法,在下面的例子中,是无法打印的。

同样下面的代码也会报错:

    let student : Person = Student(name:"john")
    print(student.name) //这里是会报错的

p的底层逻辑实现:

第三种方式是通过v打印。
v同样不会不会随着func debugDescription()方法修改而且改变打印的值。
而且v有自己的语法,不需要通过编译,而是进行动态类型解析,但是它无法执行代码。

v的底层逻辑实现:

总结

  po p v
显示对象的方式 通过对象描述方法打印 通过格式化打印 通过格式化打印
计算结果的方式 通过编译表达,可以完整访问编程语言 通过编译表达,可以完整访问编程语言 有自己的语法、解释和表达,解释过程中会多次动态类型解析

参考链接

LLDB: Beyond “po”


请保持转载后文章内容的完整,以及文章出处。本人保留所有版权相关权利。

分享到: