【问题标题】:Retaining cycle with passing objects通过对象的保持循环
【发布时间】:2017-03-22 16:42:23
【问题描述】:

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

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

class B: UIView {

    var delegate : CustomDelegate?
}

我设置在 A 里面:

b.delegate = self

这个创建retain循环,因为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 中的所有对象都是弱引用,我会失去什么?或者更好的女巫对象需要弱?

【问题讨论】:

  • 你的代码没有意义。 UIView A 怎么会说self.object?它没有object 属性。什么是 SomeObject?
  • “如果 B 中的所有对象都是弱引用,我会失去什么?或者更好的女巫对象需要弱引用?”太宽或太圆。
  • 马特,A里面的代码只是一个说明,当然A应该有变量对象,A应该添加B作为子视图,...但我认为这是案例应用。对于 B 中的所有对象,我想到了将在 A 中设置的对象,但你含蓄地回答了我。
  • 一般来说,您可能想阅读我对内存管理的解释,从这里开始:apeth.com/iOSBook/…
  • 谢谢你。

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


【解决方案1】:

我假设您的第一个(也是唯一一个真正的)问题旨在暗示这样的事情:

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 背后变异第三个​​对象(或 反之亦然);但从内存管理的角度来看,没有发生任何有趣的事情。

如果 B 中的所有对象都是弱引用,我会失去什么

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 2022-07-12
    • 1970-01-01
    • 2016-10-11
    • 2014-01-11
    • 2021-05-09
    • 2012-03-27
    • 2017-07-18
    相关资源
    最近更新 更多