Почему экранирование требует от нас явного обращения к самому себе? - PullRequest
0 голосов
/ 25 ноября 2018

Документация Apple Swift гласит:

Маркировка замыкания с помощью @escaping означает, что вы должны явно ссылаться на себя внутри замыкания.

var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

func someFunctionWithNonescapingClosure(closure: () -> Void) {
    closure()
}

class SomeClass {
    var x = 10
    func doSomething() {
        someFunctionWithEscapingClosure { self.x = 100 }
        someFunctionWithNonescapingClosure { x = 200 }
    }
}

Но яне в состоянии понять причину этого?

В одной из своих лекций в Стэнфорде (я точно не помню, какая из них) Пол Хегарти сказал, что Свифт указывает на возможность цикла удержания, заставляя вас написать «я».,Так существует ли возможность цикла хранения при использовании экранирующих замыканий?Или есть какая-то другая причина, почему мы должны явно ссылаться на себя в замыканиях, помеченных как экранирующие?

И почему в другом случае (не экранирующие замыкания) нет возможности цикла удержания?

Заранее спасибо.

1 Ответ

0 голосов
/ 25 ноября 2018

Self используется для хранения / захвата экземпляра объекта, которому вы хотите отправить сообщение.Если вы не используете self, то компилятор не будет знать, куда отправить сообщение

Стэнфордская лекция верна, но почему это происходит?Наличие себя в замыкании может превратиться в референтный цикл, когда объект никогда не отпускается.Вы можете избежать этого, используя слабое Я или неизвестное Я.Однако вам следует использовать только слабое «я» или «неизвестное я», чтобы избежать сильного референтного цикла.

Дайте мне знать, если это правильно отвечает на ваш вопрос или вам нужна дополнительная помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...