背景:
我已经完成了以下工作
1. 观看了 WWDC 2012 中 UICollectionView 的相关视频。不幸的是,他们没有过多地讨论装饰视图。
2. 实现了一个带有装饰视图的集合视图。我将 UICollectionViewFlowLayout 子类化以包含装饰视图。
3. 我已阅读 Apple 的 UICollectionView 编程指南。
4. 我了解装饰视图仅由 Layout 对象控制。
问题:
1. 当我用 Instruments 分析代码时,我发现我的装饰视图导致了内存泄漏。
2. 在进一步分析代码时,我发现装饰视图并没有像我预期的那样被重用。每次需要装饰视图时,都会创建一个新视图。
3. 当集合视图释放时,只有最后创建的装饰视图被释放,所有其他装饰视图泄漏。
4.我不明白装饰视图在没有deque方法的情况下如何被重用。
问题:
1. 我们是否必须手动管理从集合视图中删除和添加装饰视图?
我对装饰视图的一般工作方式感到困惑。对此的任何指示都会有所帮助。我的布局对象的代码如下。在代码中,我只是在我的集合视图顶部放置了一个 10 磅宽的条。每次滚动条离开屏幕然后回到屏幕时,都会分配一个新的装饰视图。当集合视图被释放时,只有最后分配的装饰视图被释放。休息所有泄漏。
#import "CollectionViewFlowLayoutSubclass.h"
#import "CollectionViewDecorationView.h"
#define DECORATION_VIEW_KIND @"DecorationViewShelf"
@implementation CollectionViewFlowLayoutSubclass
- (void)awakeFromNib
{
[super awakeFromNib];
[self registerClass:[CollectionViewDecorationView class] forDecorationViewOfKind:DECORATION_VIEW_KIND];
}
- (void)prepareLayout
{
[super prepareLayout];
}
- (CGSize)collectionViewContentSize
{
return [super collectionViewContentSize];
}
- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray* larrayAttributes = [super layoutAttributesForElementsInRect:rect];
NSMutableArray* larrayMutableAttributes = [larrayAttributes mutableCopy];
CGRect lrectFrame = CGRectMake(0, 0, 320, 10);
if (CGRectIntersectsRect(rect, lrectFrame))
{
UICollectionViewLayoutAttributes* lobjLayoutAttributes =
[UICollectionViewLayoutAttributes layoutAttributesForDecorationViewOfKind:DECORATION_VIEW_KIND
withIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];
lobjLayoutAttributes.frame = CGRectMake(0, 0, 320, 10);
[larrayMutableAttributes addObject:lobjLayoutAttributes];
}
else
{
NSLog(@"Rect %@ does not intersect %@", NSStringFromCGRect(rect), NSStringFromCGRect(lrectFrame));
}
return [NSArray arrayWithArray:larrayMutableAttributes];
}
@end