使用 Xcode LLDB 控制台在 Swift 中调试闭包



我坚持使用Xcode LLDB调试控制台的一个有趣的行为。当我使用weak self + guard self语句来防止内存泄漏时,我在调试代码时遇到奇怪的行为,尝试打印闭包参数(如示例中的响应)或任何来自闭包的类/结构属性。这是一个闭包的示例,带有打印语句的行有一个断点,我正在尝试从 Xcode 控制台打印响应参数。

Alamofire.request(url).responseJSON { [weak self] response in
guard let self = self else { return }
print("This line has a breakpoint and I am trying to print response from debug console")
}

我尝试使用以下命令:

po response
p response
print response
e response
expression response

我总是收到这样的错误:

(lldb) po response
error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used; consider replacing with assignment to '_' or removing it
var $__lldb_error_result = __lldb_tmp_error
~~~~^~~~~~~~~~~~~~~~~~~~
_
error: <EXPR>:18:5: error: value of type 'APIManager' has no member '$__lldb_wrapped_expr_25'
$__lldb_injected_self.$__lldb_wrapped_expr_25(     
^~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~

你也坚持这个问题吗?为什么我会收到该错误,除了删除weak self + guard self语句或将print(response)插入闭包代码之外,还有哪些可能的解决方法?

临时解决方案:

不要使用自阴影,而是使用像这样的变量名称_self这样你就不会收到像上面这样的 lldb 错误:

Alamofire.request(url).responseJSON { [weak self] response in
guard let _self = self else { return }
// your code here ...
}

或者使用 LLDB 命令代替vpov命令的输出格式略有不同,但它应该显示大多数情况下所需的信息。

虽然你可能早就忘记了这个问题,但我的第一个猜测是它是一个编译器优化,因为你没有在闭包的任何地方使用response参数。

@matt评论中对此有更多介绍。

相关内容

  • 没有找到相关文章

最新更新