【问题标题】:Create Swift class instance variable with lldb, versus Objective-C使用 lldb 创建 Swift 类实例变量,而不是 Objective-C
【发布时间】:2018-11-25 12:16:40
【问题描述】:

使用我的调试器 (lldb),当它是 Objective-C 代码时,我可以轻松地创建实例类。

(lldb) e id $my_hello = [hello_from_objc new]
(lldb) po $my_hello
<hello_from_objc: 0x1c4013020>
(lldb) po [$my_hello secret_objc_method]
0x000000000000002a
(lldb) po (int) [$my_hello secret_objc_method]
42

但是当代码是纯 Swift 时,我不知道如何对 lldb 的表达式命令执行相同的操作。我很容易在 Swift 代码中创建一个实例..

let my_swift_framework = Hello_Class()
print("✔️ \(my_swift_framework.samplePublicVariable)")

【问题讨论】:

    标签: objective-c swift lldb


    【解决方案1】:

    这里是一个例子:执行 Swift 代码之后

    class HelloClass {
        func hello() {
            print("hello")
        }
    }
    

    您可以在调试器窗口中创建一个对象:

    (lldb) expression let $myHello = HelloClass()
    (lldb) po $myHello
    <hello_class: 0x101121180>
    
    (lldb) po $myHello.hello()
    hello
    

    如果遇到错误

    error: unknown type name 'let'
    error: use of undeclared identifier 'HelloClass'
    

    然后将表达式语言显式设置为 Swift:

    (lldb) expression -l swift -o -- let $myHello = HelloClass()
    
    (lldb) expression -l swift -o -- $myHello.hello()
    

    或者您可以将 lldb 语言上下文更改回 Swift:

    (lldb) settings set target.language swift

    【讨论】:

    • 在 C 和 Swift lldb 表达式解析器中,初始 $ 用作 lldb 持久变量的“命名空间”指示符。这使它们远离程序变量。 lldb 表达式中没有初始 $ 的变量是表达式的本地变量。
    • 这对我不起作用。 (错误:未知类型名称'let',错误:使用未声明的标识符'HelloClass' - 即使它在符号表中)。我尝试使用 lldb 在命令行上使用 xCode 和 lldb 以调试模式连接到应用程序。我也试过这篇文章:stackoverflow.com/questions/29441418/…
    • @rustyMagnet:我用一个命令行应用程序测试了这个,直接从 Xcode 运行。恐怕我目前没有更好的解决方案。
    • @MartinR 我找到了答案。 appDelegate 运行后,似乎有些东西正在自动设置 lldb 表达式 -l。
    • @rustyMagnet:所以-l swift 终于有帮助了吗?很高兴您解决了问题! – (但请注意,Swift 的命名约定与(例如)Python 完全不同,所有标识符都使用驼峰式大小写 - 类型的大写驼峰式,其他所有的驼峰式小写 :)
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 2013-02-02
    • 2023-04-04
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2014-07-28
    • 2010-11-13
    相关资源
    最近更新 更多