繁体   English   中英

为什么有弱无力的人? 为什么我们不总是使用弱项?

[英]Why are there weak _and_ unowned? Why can we just not always use weak?

我刚刚阅读了Swift书中ARC部分,以及其他一些有关weak引用和unowned引用的相关文章。

阅读后,我对它们的用途以及在每种情况下将要使用的每种情况都有清晰的了解(另请参见此SO帖子 ,它对此做了很好的解释)。

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

现在,开发人员需要了解何时使用这两种方法中的哪一种,并且Apple在解释不同情况方面做得很好,但他们没有说明原因 例如, 提供weak这样开发人员就无需深入研究文档并了解不同的用例,是否会更简单?

我想,用另一种方式来表达这个问题的方式是:除了苹果公司告诉我们的以外,为什么我们应该完全使用unowned 至少从MM的角度来看,这没有什么区别,在文档中我们应该使用unowned地方使用weak不会造成内存泄漏?

区别在于变量的可选性。 就像Apple在您提供的链接的“无主引用”部分中所说的那样:

但是,与弱引用不同,假定无主引用始终具有值。 因此,始终将无主引用定义为非可选类型。

在封闭块中,此用法的使用更为明显。 在这里您不必使用? 运算符,或者如果在闭包内部使用该对象,则获取该对象的引用。

而不是这样写:

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

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

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

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

弱和无主在Swift的Optional语义之外的含义有所不同。 弱引用更准确地称为自动归零弱引用。 系统知道存储在弱变量中的对象,并在释放该对象时进行额外的工作以将该值归零。 作为其中的一个结果是 ,弱变量是斯威夫特选配。

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

暂无
暂无

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

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