gpt4 book ai didi

ios - 与传递对象保持循环

转载 作者:行者123 更新时间:2023-11-28 10:56:52 28 4
gpt4 key购买 nike

我对保留周期感兴趣。假设我们有两个 View ,A 和他的 subview B。

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

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 中的所有对象都是弱引用,我会失去什么?或者更好的女巫对象需要变弱?

最佳答案

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

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

... 然后我们假设我们有一个 A 和一个 B,其中 B 是 A 的 subview 。那么 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

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

关于ios - 与传递对象保持循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42957823/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com