在UICollectionViewFlowLayout子类中重复使用/泄漏装饰视图

时间:2013-06-01 12:56:02

标签: ios ios6 uicollectionview ios6.1

上下文 我已经做了以下几件事 1.从WWDC 2012观看UICollectionView的相关视频。不幸的是,他们没有讨论装饰视图 2.实现了具有装饰视图的集合视图。我将UICollectionViewFlowLayout子类化为包含装饰视图 3.我已经阅读了Apple的UICollectionView编程指南 4.我知道装饰视图仅由布局对象控制。

问题:
1.当我用仪器分析代码时,我发现我的装饰视图导致内存泄漏 2.在进一步分析代码时,我发现装饰视图没有按照我的预期重复使用。每次需要装饰视图时,都会创建一个新视图 3.当集合视图deallocs时,只有最后创建的装饰视图被dellocated,所有其他装饰视图都会泄漏 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

0 个答案:

没有答案