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