Я застрял с интересным поведением консоли отладки Xcode LLDB. Когда я использую оператор weak self + guard self
для предотвращения утечек памяти, я сталкиваюсь со странным поведением при отладке своего кода при попытке напечатать параметр закрытия (например, ответ в примере) или что-либо свойство класса/структуры из закрытия. Это пример закрытия, и строка с оператором print имеет точку останова, на которой я пытаюсь напечатать параметр ответа из консоли 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 ...
}
Или используйте команду v
LLDB вместо po
. Команда v
имеет немного другое форматирование вывода, но она должна показывать вам необходимую информацию в большинстве случаев.