Objective c UIView如何防止保留周期?

Objective c UIView如何防止保留周期?,objective-c,uiview,retain-cycle,Objective C,Uiview,Retain Cycle,子视图具有对superview的引用,而superview也具有对子视图的引用(子视图) 我想知道为什么这不会导致retain循环?UIView的superview属性声明为 @property(nonatomic, readonly) UIView *superview; 在Objective-C中,自引入ARC以来,默认情况下,未使用不同所有权说明符声明的属性为assign,但是,UIKit标题似乎未使用ARC,因此此属性最像assign。另外请注意,由于属性是只读的,因此源中很可能有一个

子视图具有对superview的引用,而superview也具有对子视图的引用(子视图)


我想知道为什么这不会导致retain循环?

UIView
superview
属性声明为

@property(nonatomic, readonly) UIView *superview;

在Objective-C中,自引入ARC以来,默认情况下,未使用不同所有权说明符声明的属性为
assign
,但是,UIKit标题似乎未使用ARC,因此此属性最像
assign
。另外请注意,由于属性是只读的,因此源中很可能有一个自定义getter,因此属性中的所有权说明符不一定告诉我们任何事情。可以肯定的是,苹果的实施方式避免了保留周期

assign
相当于
\uuuu unsafe\u unretained
,它是一个非归零弱引用。这意味着它不会保留对象,但在对象解除分配时不会设置为
nil
。这比
(因为它不需要检查和归零)具有更高的性能,但不安全,因为如果取消分配引用的对象,您可能正在访问垃圾内存

还要注意的是,该属性被声明为
只读
,这意味着它实际上可以实现为一个返回私有实例变量的方法,或者执行我们完全不知道的其他操作。基本上,重要的是您可以假设此属性不保留它所引用的对象


在今天的新代码中,您应该使用
而不是
分配

一个引用是弱的。我假设一个引用必须是一周。然而,我始终无法确定哪一个是弱的。对superview的引用是弱的。
@property(非原子,只读)UIView*superview
我在文档中没有看到superview。好的,所以它是
分配
,而不是
。在Objective-C中,默认情况下,未使用其他所有权说明符声明的属性应为
strong
,对吗?我认为这实际上是因为
@属性(非原子、只读、复制)NSArray*子视图
,所以父视图不保留子视图,因为
copy
属性。另外,
assign
属性不执行任何内存管理。这是基本数据类型的默认行为<代码>分配并不等同于
不安全
@DavidLiu
不安全
分配
实际上在实践中是相同的,请参阅。