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

时间:2014-09-16 10:28:52

标签: ios xcode swift automatic-ref-counting

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

是的,那些是等价的。这就是unowned的重点 - 它就像weak一样,除了你不必处理一个可选的并打开它,因为它的类型是未包装的非 - 选择型;它是weak,每次出现时都会被强行打开。

答案 2 :(得分:1)

应该像这样使用

{ [weak self] in

    guard let weakSelf = self else {
       return 
    }

    weakSelf.number = weakSelf.number + 1
}

感谢 @José的评论,请注意,即使以下代码目前正常运行,但它被视为编译器错误,应该避免使用https://lists.swift.org/pipermail/swift-evolution/Week-of-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
}