Любая переменная, на которую есть ссылка в закрытии, будет сильно сохраняться этим закрытием. Вы можете настроить это, включив список захвата закрытия (например, [weak self]
), который позволяет вам указать конкретный шаблон управления памятью ссылок, захваченных в закрытии.
func someFunction(){
let someVariable = MyObject()
someOtherFunction(completionBlock:{ [weak self] in
self?.doStuff(with: someVariable)
})
}
Здесь, someVariable
удерживается закрытием, как вы заявили. В этом случае он должен иметь , потому что это больше никому не нужно. Как вы упомянули в комментариях, если вы использовали список захвата [weak someVariable]
, то при выполнении блока завершения он всегда будет равен нулю, так как он вышел из области видимости в своей исходной функции.
«Крошечный цикл сохранения» не создается. Цикл сохранения должен быть цикл - то есть A содержит сильную ссылку на B, которая содержит сильную ссылку на A. someVariable
не имеет ссылок ни на что.
Как только someOtherFunction
закончится со ссылкой на завершение завершения, все исчезнет. Закрытие - это еще одна переменная, что касается someOtherFunction
, и оно будет существовать до тех пор, пока оно находится в области видимости.
Должен ли я ослабить «локальные» переменные, используемые в блоке? - нет, поскольку к тому времени, когда блок их использует, они будут равны нулю.