与传递对象保持循环

Retaining cycle with passing objects

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

我知道如果 B 有一个定义为

的(自定义)委托
class B: UIView {

    var delegate : CustomDelegate?
}

然后我在 A 里面设置:

b.delegate = self

这创建了循环引用,因为B对A有强引用,A对be有强引用,所以两者都不能被释放。

问题:

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

class B: UIView {

    var object : SomeObject?
}

A 内部:

b.object = self.object

这也是一个保留环吗?我想不通。

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

第二个问题:

如果 B 中的所有对象都是弱引用,我会失去什么?或者更好 object needed be weak?

我假设你的第一个(也是唯一一个真实的)问题是为了暗示这样的事情:

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,它们每个都有对同一个 third 对象的强引用,即既不是这个 A 也不是这个 B 的东西。这没有错,事实上,A 和 B 都保留第三个对象可能 至关重要 。我们可能会质疑 A 告诉 B 它的 object 应该是什么的合法性,我们可能会合理地对 A 可能 变异 B 背后的第三个对象的可能性感到不安(或 反之亦然);但从内存管理的角度来看,没有发生任何有趣的事情。

What could I lose if all object inside B would be weak references

你可能会失去一切。请记住,普通(强)引用是使引用对象保持活动状态(保留)的一种方式;这就是属性的内存管理的全部内容。另一方面,分配给弱引用不会这样做,因此如果没有其他东西保留它,可能会导致分配的对象立即消失。弱引用仅适用于被引用对象的生命周期在其他地方正确且完全确定的情况(例如,父视图确定其子视图的生命周期)。