Subview(子视图)引用了Superview(父视图),而Superview也引用了Subview(子视图)。
我想知道为什么这不会导致循环应用?
Subview(子视图)引用了Superview(父视图),而Superview也引用了Subview(子视图)。
我想知道为什么这不会导致循环应用?
UIView
's superview
property is declared as
@property(nonatomic, readonly) UIView *superview;
assign
strong
,自从引入ARC以来,但是UIKit头文件似乎没有使用ARC,因此该属性最可能是assign
。还要注意,由于属性是只读的,源代码中很可能有一个自定义getter,因此属性中的所有权说明符并不能告诉我们任何信息。可以安全地假设苹果已经以避免保留循环的方式实现了它。
assign
等价于__unsafe_unretained
,这是一个非零弱引用。这意味着它不会保留对象,但在对象被释放时不会设置为nil
。这比weak
具有更高的性能(因为它不需要被检查和清零),但不安全,因为如果引用的对象被释放,您可能正在访问垃圾内存。readonly
,这意味着它实际上可以被实现为返回私有实例变量的方法,或者完全执行我们不知道的其他操作。基本上,重要的是您可以假设此属性不会保留所引用的对象。weak
而不是assign
。strong
,对吗?我认为实际上是因为@property(nonatomic, readonly, copy) NSArray *subviews
,所以父视图不会持有子视图的保留计数,因为有了copy
属性。 - David Liuassign
属性不执行任何类型的内存管理。这是原始数据类型的默认行为。assign
与__unsafe_unretained
不等同。 - David Liu