UIView如何防止retain cycle?
How does UIView prevent retain cycle?
子视图有对父视图的引用,而父视图也有对子视图的引用(子视图)。
我想知道为什么这不会导致保留周期?
UIView
的 superview
属性 声明为
@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
。
子视图有对父视图的引用,而父视图也有对子视图的引用(子视图)。
我想知道为什么这不会导致保留周期?
UIView
的 superview
属性 声明为
@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
。