2016-08-17 54 views
0

根据UICollectionView和UICollectionViewLayout的类引用,UICollectionView持有对其collectionViewLayout属性的强引用,并且UICollectionViewLayout还拥有对其collectionView属性的强引用。UICollectionView和它的collectionViewLayout之间是否存在保留循环?

在UICollectionView,

@property(nonatomic, strong) UICollectionViewLayout *collectionViewLayout 

在UICollectionViewLayout,(强是默认属性属性)。

@property(nonatomic, readonly) UICollectionView *collectionView 

在这里看起来像一个保留周期。为什么UICollectionViewLayout不是对collectionView持有一个弱引用呢?

+1

'strong'从不是readonly属性的默认属性,因为只读属性没有任何后援ivar,'strong'或'weak'仅适用于后备ivars。 'UICollectionViewLayout'可能保留其父'UICollectionView'的'weak'引用,并从readonly属性的getter中返回它,从而避免保留周期。 –

回答

1

在UICollectionViewLayout中,(strong是默认属性属性)。

@property(nonatomic, readonly) UICollectionView *collectionView 

这是默认的,但一个readonly属性没有存储,它只是一个getter。在内部,布局必须对集合视图有一个弱引用。我没有它的实际源代码的任何知识,但它可能是这样的:

@interface UICollectionViewLayout() 
@property(nonatomic, weak, readwrite) UICollectionView *collectionView; 
@end 

但如果你跑出仪器居然发现你应该提起雷达泄漏,因为它肯定是在我的书的错误。

+0

很好的答案!但只读属性总是没有存储?如果readonly属性的getter没有实现,并且该属性在内部没有被重新声明为readwrite,那么它将会有一个ivar,对吧? –

+0

哦,我正要回答“否”,但它看起来像编译器会自动合成一个ivon只读属性。我会尝试在运行时找到一些东西来检查伊娃,看它是否强壮,我现在也很好奇。如果我找到任何东西,我会更新答案。 –

+0

谢谢!我认为它应该是强大的。 –

1

Does Objective-C readonly property need to specify retain or copy?的答案中所述,strongweak不适用于只读属性 - 至少不基于属性的公共声明。

只读属性的实际内容在于它是如何实际执行的。很可能该物业在私人类别延期中重新标示为:

@property (nonatomic, weak, readwrite) UICollectionView *collectionView; 

这样可以避免收集视图与其布局之间的保留周期。

+0

很好的答案!因此,如果只读属性没有getter并且在内部不被重新声明为readwrite,那么strong也应该适用于该属性,因为它现在有一个ivar,这是正确的吗? –

+0

只读属性只有一个getter,而不是setter。默认情况下,伊娃是强壮的。 – rmaddy

+0

我的意思是它的getter没有实现,所以编译器会为它合成一个ivar。 –

相关问题