为什么我会使用无主的自我?

kev*_*vin 14 ios swift swift3

iOS应用程序中出现以下模式:

class MyViewController: UIViewController {
    let myModel = MyModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        myModel.foo() { [***] in
            // use self here
        }
    }
}

class MyModel {
    public func foo(complete: () -> Void) {
        // do something
        complete()
    }
}
Run Code Online (Sandbox Code Playgroud)

当你可以保证在完成时自我不会为零而在你不确定引用是否仍然有效的时候是弱的时候,使用其中一个[unowned self][weak self]代替[***]无主的.
我不明白为什么我会冒险使用无主,也许我确信现在参考永远不会是零,但这可能在未来发生变化.我也可能忽略了一个边缘案例,错误发生了.我可以很容易地总是使用弱,并在封闭的顶部放一个警卫,以便能够使用自己没有!要么 ?.
无主的用途是什么?它比弱+守卫更快吗?是语法糖吗?这似乎违背了Swift的保护开发人员免受可能导致崩溃的常见错误的理念.

Jer*_*myP 15

unowned具有边际性能优势,weak因为运行时不必跟踪引用以nil在对象消失时将其转换为引用.

关于保留周期(好的,强参考周期),既没有weak也没有unowned创建强引用(在ARC之前的术语中,既不增加保留计数)所以没有参考周期的危险,事实上,这就是你需要的原因指定weakunowned用于self闭包.

此外,unowned您可以将引用用作非可选项,因此您不必在闭包中放入任何代码来解包它.

我总是使用,weak除非有一个非常好的表现理由不这样做.

注意,在你的代码中,我认为没有必要,因为闭包没有转义,即函数调用foo中对它的引用在foo范围结束后不会持续存在.