Как добиться односторонней ссылки в быстрых замыканиях
Я пытаюсь инкапсулировать большую часть моей асинхронной активности в операциях, и часто у меня есть операции, запускающие другие операции и т. Д.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я ссылаюсь на исходную операцию, она может быть освобождена до того, как последующие операции будут завершены. Закрытия, которые я использую, терпят неудачу, если у меня weak self
, weak me = self
или (катастрофически) unowned me = self
на месте; но если я использую self
без них ни одна операция не освобождает (утечка памяти).
Возможно ли сохранить ссылку изнутри замыкания, не создавая двусторонней циклической ситуации ссылки?
1 ответ
Прежде всего вам нужно спросить себя, является ли ваш self
будет ноль в будущем или нет. Если да то weak
а также unowned
приходит в картинке.
Безопасный способ сделать это использовать weak
и затем проверьте, был ли он освобожден или нет.
your-closure { [weak self] in
guard let strongSelf = self else {
print("self is been deallocated")
return
}
}
Когда замыкание выполняется в вышеуказанном случае, оно будет захватывать только weak self
, В тот момент, когда закрытие начинается, weak self
либо self
или это ноль. Вы можете проверить, если strongSelf
установлен или нет.
Если weak self
равно self
, затем strongSelf
сохраняет его, и он остается сохраненным до тех пор, пока закрытие не вернется после освобождения. Это все или ничего.