我刚刚阅读了ARC section in the Swift book以及其他一些有关weak
和unowned
引用的相关帖子。
在我阅读之后,我确实清楚地了解它们是什么以及它们在什么情况下都会被使用(另见this SO post,它给出了很好的解释)。
但是,我无法理解为什么 Apple甚至想出了这两个解决方案?本质上,从MM的角度来看,两者都归结为没有创建对引用对象的强引用(即不增加其retainCount
)。那么,为什么在这里甚至打扰并提供两个MM原语呢?
现在,开发人员需要了解何时使用这两者中的哪一个,而Apple在解释不同场景方面做得很好,但他们没有说为什么。它不会更简单吗? 仅提供weak
,以便开发人员无需深入了解文档并了解不同的用例?
我想,另一种表达问题的方法是,为什么我们应该使用unowned
,除非Apple告诉我们这样做?至少从MM的角度来看,这不会产生任何影响并使用weak
根据文档我们应该使用unowned
不会造成内存泄漏?!
答案 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的内存,指针算术,等等。将指针类型声明为无主义基本上告诉编译器“不要担心它。我知道我在做什么。”在您尝试取消引用它之前,确保指针始终有效,然后自己管理指针后面的内存,这就是您的负担。