通过传递对象保留周期

时间:2017-03-22 16:42:23

标签: ios swift memory-management reference-counting retain-cycle

我对保留周期很感兴趣。 假设我们有两个视图,A和他的子视图B.

我知道如果B有(自定义)委托定义为

class B: UIView {

    var delegate : CustomDelegate?
}

我在A:

中设置
b.delegate = self

这创建了保留周期,因为B对A有很强的引用,A有强引用,所以两者都不能被释放。

问题:

如果我在A中有对象并且我想将它传递给B对象怎么办。

class B: UIView {

    var object : SomeObject?
}

并在A:

b.object = self.object

这也是一个保留周期吗?我无法解决这个问题。

当创建对象(在A中)时,它的引用是1.当它被传递给B时它的引用是2.但是当A尝试释放自身时:当在A中释放对象时将引用减少为1,当他尝试释放B时,对象引用应该为0.这是否意味着没有保留周期?或者B是否间接引用了A trough对象?

第二个问题:

如果B中的所有对象都是弱引用,我会失去什么?或者更好的女巫对象需要弱吗?

1 个答案:

答案 0 :(得分:3)

我认为你的第一个(也是唯一真实的)问题意在暗示这样的事情:

class A : UIView {
    var object : NSObject
}
class B : UIView {
    var object : NSObject
}

...然后我们假设我们有A和B,其中B是A的子视图。那么A可能会说:

(self.subviews[0] as! B).object = self.object // or similar

...你想知道这里是否涉及保留周期。不,不是一般情况。有两个对象,A和B,它们各自对同一个第三个​​对象有一个强引用,即既不是A也不是B的东西。这没有什么不对,确实可能至关重要 A和B都保留第三个对象。我们可能会质疑A告诉B它object应该是什么的合法性,我们可能会合理地被A可能突变这个B背后的第三个对象(或< em>反之亦然);但从内存管理的角度来看,没有任何兴趣发生过。

  

如果B中的所有对象都是弱引用

,我会失去什么

你可能会失去一切。请记住,正常(强)引用是一种保持引用对象存活(保留)的方法;这就是属性的内存管理的全部意义所在。另一方面,分配给弱引用不会这样做,因此如果没有其他任何东西保留它,则可以使分配的对象立即消失。弱引用仅适用于引用对象的生命周期在其他地方正确且完全确定的情况(例如,superview确定其子视图的生命周期)。

相关问题