繁体   English   中英

在逻辑上无主,相当于弱! 在斯威夫特

[英]Is unowned logically equivalent to weak! in Swift

这些块总是会在相同的情况下失败(当关闭被执行但是自我被解除分配时)?

{ [unowned self] in
    //use self
    self.number = self.number + 1
}

{ [weak self] in
    //use self!
    self!.number = self!.number + 1
}

无主引用并不保留对self的强引用,但是它假设对象总是有一些值(不是nil),并且如果某些对象在执行块时自行解除分配,则上面的代码崩溃。

对于弱的情况,如在您的示例中,weak是块内的可选类型,因此也可能有值或者它可能是nil。 您有责任检查值是否存在并在其上调用方法。 如上所述,如果使用展开运算符(!),当self被释放时,它肯定会崩溃。 因此,代码的版本都会崩溃,如果它发生了,那么块仍在执行,并且self同时被释放。

因此,我建议使用weak来使用可选的检查来保护此类崩溃,

{ [weak self] in
    if let me = self {
       me.number = me.number + 1
    }
}

是的,那些是等价的。 这是unowned的点 - 它就像weak一样,除了你不需要处理一个可选的并解开它,因为它的类型是unwrapped非可选类型; 它很weak ,总是在每次出现时被强行打开。

应该像这样使用它

{ [weak self] in

    guard let weakSelf = self else {
       return 
    }

    weakSelf.number = weakSelf.number + 1
}

感谢@José的评论,请注意,即使以下代码目前有效,但它被认为是编译器错误,应该避免使用https://lists.swift.org/pipermail/swift-evolution/Week- -Mon-20160118 / 007425.html

你也可以这样打开self

{ [weak self] in

    guard let `self` = self else {
       return 
    }

    // Now you can use `self` safely
    self.number = self.number + 1
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM