UIView如何防止retain cycle?

How does UIView prevent retain cycle?

子视图有对父视图的引用,而父视图也有对子视图的引用(子视图)。

我想知道为什么这不会导致保留周期?

UIViewsuperview 属性 声明为

@property(nonatomic, readonly) UIView *superview;

在 Objective-C 中,没有不同的所有权说明符 声明的属性默认为 assign strong 自引入 ARC 以来默认为 strong ,但是,UIKit headers 似乎没有使用 ARC,所以这个 属性 最像 assign。另请注意,由于 属性 是只读的,因此源代码中很可能存在自定义 getter,因此 属性 中的所有权说明符不一定会告诉我们任何信息。可以安全地假设 Apple 已经以避免保留周期的方式实现它。

assign等同于__unsafe_unretained,是一个non-zeroing弱引用。这意味着它不保留 object,但在释放 object 时不会设置为 nil。这比 weak 具有更高的性能(因为它不需要检查和归零),但不安全,因为如果引用的 object 被释放,您可能会访问垃圾内存。

另请注意,属性 声明为 readonly,这意味着它实际上可以实现为 returns 私有实例变量的方法,或完全执行其他操作我们不知道。基本上,重要的是你可以假设这个 属性 不保留它引用的 object .

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