为什么弱_和_无主?为什么我们不能总是使用弱者?

时间:2016-02-24 15:37:39

标签: ios swift memory-management automatic-ref-counting

我刚刚阅读了ARC section in the Swift book以及其他一些有关weakunowned引用的相关帖子。

在我阅读之后,我确实清楚地了解它们是什么以及它们在什么情况下都会被使用(另见this SO post,它给出了很好的解释)。

但是,我无法理解为什么 Apple甚至想出了这两个解决方案?本质上,从MM的角度来看,两者都归结为没有创建对引用对象的强引用(即不增加其retainCount)。那么,为什么在这里甚至打扰并提供两个MM原语呢?

现在,开发人员需要了解何时使用这两者中的哪一个,而Apple在解释不同场景方面做得很好,但他们没有说为什么。它不会更简单吗? 提供weak,以便开发人员无需深入了解文档并了解不同的用例?

我想,另一种表达问题的方法是,为什么我们应该使用unowned,除非Apple告诉我们这样做?至少从MM的角度来看,这不会产生任何影响并使用weak根据文档我们应该使用unowned不会造成内存泄漏?!

2 个答案:

答案 0 :(得分:3)

区别在于变量的可选性。就像Apple在您提供的链接的“无主参考”部分中所述:

  

与弱引用不同,假定无主引用   永远有价值。因此,始终是无主参考   定义为非可选类型。

在闭包块中更明显地使用它。在这里你不必使用?如果在闭包内使用它,则运算符或获取对象的引用。

而不是写这个:

UIView.animateWithDuration(0.2) {
    [weak self]
    () -> Void in
    self?.view.layoutIfNeeded()
}

但是,如果您可以确定在动画之前不会释放对self的引用,并且您可以简单地写入unowned而不必使用?运算符或使用if let语句解包:

UIView.animateWithDuration(0.2) {
    [unowned self]
    () -> Void in
    self.view.layoutIfNeeded()
}

答案 1 :(得分:3)

@Kádi关于弱变量是可选的答案是正确的,但不完整。

弱和无主在Swift的Optional语义之外的含义上有所不同。弱引用更准确地称为自动归零弱引用。系统知道存储在弱变量中的对象,并且当对象被释放时,转到额外的工作以将值清零。作为结果,弱变量是Swift中的选项。

无主指针根本不是内存管理。它们是一个可以取任何值的原始内存指针。 (它们仍然可以被键入以指向特定类型的结构,因此它们并不总是像C void指针那样是“原始”。)无主指针对于指向malloc的内存,指针算术,等等。将指针类型声明为无主义基本上告诉编译器“不要担心它。我知道我在做什么。”在您尝试取消引用它之前,确保指针始终有效,然后自己管理指针后面的内存,这就是您的负担。