Я знаю, что мы можем использовать Strong Self в DispatchQueues, когда вызываем его непосредственно в коде, например:
func foo() {
DispatchQueue.global().async {
print(self.someProperty)
}
}
Но что насчет моей пользовательской очереди, если я оставлю ее в классе? Стоит ли использовать weak self или все работает так же, и не нужно беспокоиться об утечках?
class MyClass {
let queue = DispatchQueue(
label: "MyQueue",
qos: .userInitiated
)
func foo() {
queue.async { [weak self] in
guard let self else { return }
print(self.someProperty)
}
}
}
В этом случае моя пользовательская очередь хранится в переменной класса, и, вероятно, мне следует использовать weak self. Или нет?





queue.async замыкание сохраняет self без [weak self]. Однако это временно, оно исчезнет сразу после удаления из очереди. Таким образом, здесь нет цикла сохранения.
AFAIK, это больше похоже на поток данных, чем на цикл сохранения.
[weak self]: возможно, вам захочется выйти из области действия раньше.[weak self]: вы хотите сохранить объект до тех пор, пока блок не будет выполнен.Он может поддерживать: содержательную метку для отладки или при необходимости завершать очередь.
Я имел в виду сохранить self разницу, но все равно спасибо :)
@Оранутачи — «Так нет разницы, сохраняется очередь или нет?» - Неа. Не имеет значения, сохраняете ли вы ссылку на свою пользовательскую очередь или нет. В любом случае, единственным важным фактором является то, захватывает ли замыкание, отправленное в очередь, self или нет. И, как сказал Сонл, любые сильные ссылки, зафиксированные в очереди, разрешаются после завершения ее выполнения, поэтому, как правило, это временное положение дел.
Спасибо за ответ. То есть нет разницы, хранится очередь или нет?