根据UICollectionView和UICollectionViewLayout的类引用,UICollectionView拥有对其collectionViewLayout属性的强引用,而UICollectionViewLayout也拥有对其collectionView属性的强引用。
在UICollectionView中,
@property(nonatomic, strong) UICollectionViewLayout *collectionViewLayout
在UICollectionViewLayout中,(strong是默认属性属性)。
@property(nonatomic, readonly) UICollectionView *collectionView
这里看起来像一个保留周期。为什么UICollectionViewLayout不包含对collectionView的弱引用?
答案 0 :(得分:1)
正如Does Objective-C readonly property need to specify retain or copy?的回答所述,strong
和weak
不适用于只读属性 - 至少不适用于该属性的公开声明。< / p>
只读属性的实际意义在于它是如何实际实现的。该属性很可能在私有类扩展中重新声明为:
@property (nonatomic, weak, readwrite) UICollectionView *collectionView;
这将避免集合视图与其布局之间的保留周期。
答案 1 :(得分:1)
在UICollectionViewLayout中,(strong是默认属性属性)。
@property(nonatomic, readonly) UICollectionView *collectionView
这是默认值,但readonly
属性没有存储空间,它只是一个getter。在内部,布局必须具有对集合视图的弱引用。我不知道它的实际源代码,但它看起来像这样:
@interface UICollectionViewLayout ()
@property(nonatomic, weak, readwrite) UICollectionView *collectionView;
@end
但如果您运行仪器并且实际发现泄漏,您应该提交雷达,因为它绝对是我书中的错误。