Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 物体通过时的保持循环_Ios_Swift_Memory Management_Reference Counting_Retain Cycle - Fatal编程技术网

Ios 物体通过时的保持循环

Ios 物体通过时的保持循环,ios,swift,memory-management,reference-counting,retain-cycle,Ios,Swift,Memory Management,Reference Counting,Retain Cycle,我对保留周期感兴趣。 假设我们有两个视图,A和他的子视图B 我知道如果B有一个(自定义)委托定义为 class B: UIView { var delegate : CustomDelegate? } 我在一个 b.delegate = self 这个create-retain循环,因为B对A有强引用,而A对be有强引用,所以两者都不能被释放 问题: 如果我在A中有一个对象,我想把它传递给B对象,该怎么办 class B: UIView { var object : So

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

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

class B: UIView {

    var delegate : CustomDelegate?
}
我在一个

b.delegate = self
这个create-retain循环,因为B对A有强引用,而A对be有强引用,所以两者都不能被释放

问题:

如果我在A中有一个对象,我想把它传递给B对象,该怎么办

class B: UIView {

    var object : SomeObject?
}
在一个

b.object = self.object
这也是一个很好的例子吗?我想不出来

创建对象(A中)时,其引用为1。当它被传递到B时,它的引用是2。但当A尝试解除分配自身时:当在A中解除分配对象时,它将引用减少为1,当他尝试解除分配B时,对象引用应变为0。这是否意味着没有保留周期?还是B持有对槽状物体的间接引用

第二个问题:


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

我想你的第一个(也是唯一真实的)问题是想暗示这样的东西:

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它的
对象应该是什么的合法性,我们可能会合法地被A可能在B背后变异这个第三个对象的可能性所干扰(反之亦然);但是从内存管理的角度来看,没有发生任何有趣的事情


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

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

我假设您的第一个(也是唯一一个真实的)问题旨在暗示如下内容:

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它的
对象应该是什么的合法性,我们可能会合法地被A可能在B背后变异这个第三个对象的可能性所干扰(反之亦然);但是从内存管理的角度来看,没有发生任何有趣的事情


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


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

您的代码没有任何意义。ui如何查看say
self.object
?它没有
对象
属性。什么是SomeObject?“如果B中的所有对象都是弱引用,我会失去什么?或者更好的witch对象需要弱引用?”太宽,或者是圆形。Matt,a中的代码只是一个说明,当然a应该有变量对象,a应该添加B作为子视图,。。。但我认为这是适用于本案的。当所有对象都在B中时,我想到了将在A中设置的对象,但您的回答是含蓄的。一般来说,您可能希望阅读我对内存管理的解释,从这里开始:谢谢您。您的代码毫无意义。ui如何查看say
self.object
?它没有
对象
属性。什么是SomeObject?“如果B中的所有对象都是弱引用,我会失去什么?或者更好的witch对象需要弱引用?”太宽,或者是圆形。Matt,a中的代码只是一个说明,当然a应该有变量对象,a应该添加B作为子视图,。。。但我认为这是适用于本案的。当所有对象都在B中时,我想到了将在A中设置的对象,但您的回答是含蓄的。一般来说,您可能想阅读我对内存管理的解释,从这里开始:谢谢您。