1

背景: 我已经完成了以下工作
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
4

0 回答 0