コンテキスト:
私はすでに次のことを行っています
。 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