我坚持使用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 命令代替v
po
。v
命令的输出格式略有不同,但它应该显示大多数情况下所需的信息。
虽然你可能早就忘记了这个问题,但我的第一个猜测是它是一个编译器优化,因为你没有在闭包的任何地方使用response
参数。
@matt评论中对此有更多介绍。