上下文 我已经做了以下几件事 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