Быстрая семантика, вызывающая метод с (нулевым) слабым ссылкой с помощью. оператор

Orion Edwards спросил: 03 февраля 2018 в 10:52 в: swift

Вернувшись в цель-C с ARC, это было небезопасно:

MyClass* someObject = ...
__weak MyClass* weakSomeObject = someObject;
doSomething(^{
    [weakSomeObject someMethod];
});

Почему? потому что просто вызов метода не приводит к тому, что ARC сохраняет объект, и, следовательно, экземпляр someObject может быть освобожден и освобожден в середине выполнения someMethod

Приведение этого вперед в быстрое, оно преобразуется следующим образом:

let someObject: MyClass = ...
doSomething { [weak someObject]
    someObject?.someMethod()
}

Мой вопрос: какова семантика кода ?. оператор в swift относительно ARC, и безопасно ли его использовать со слабыми вызовами эталонного метода?

Я могу представить, что быстрый компилятор, переводящий вышеуказанный код, в нечто вроде этого:

let someObject: MyClass = ...
doSomething { [weak someObject]
    if let tmp = someObject { 
        tmp.someMethod()
    }
}

Если бы это было так, то это было бы действительно безопасно, поскольку tmp является сильной ссылкой и, таким образом, заставит ARC сохранить объект в течение продолжительности вызова someMethod

Однако я мог бы предположить, что он переводится во что-то без сохранения ARC по соображениям производительности или что-то еще.

Кто-нибудь знает, что он на самом деле делает, и есть ли спецификация или документ, который делает это явным?


0 ответов