Objective c UIView如何防止保留周期?
子视图具有对superview的引用,而superview也具有对子视图的引用(子视图)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。另外请注意,由于属性是只读的,因此源中很可能有一个
我想知道为什么这不会导致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不安全
和分配
实际上在实践中是相同的,请参阅。