-1

DYRateViewを使用して、カスタムUITableViewCellクラスに星評価ビューを表示しています。DYRateView (UIView のサブクラス) のインスタンスが割り当てられ、'layoutSubviews' メソッドで初期化されます。

「layoutSubviews」でビューを割り当て/初期化するのは悪い習慣ですか? セルを再利用する場合、すべてのセルで割り当て/初期化するか、ビューを再利用しますか?

.h

@property (retain, nonatomic) IBOutlet DYRateView *rateView;

.m

- (void)layoutSubviews
{
[super layoutSubviews];

rateView = [[DYRateView alloc] initWithFrame:CGRectMake(100, 60, 160, 20) fullStar:[UIImage imageNamed:@"StarFullLarge.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge.png"]];
    NSLog(@"created");

rateView.padding = 10;
rateView.alignment = RateViewAlignmentCenter;
rateView.editable = YES;
rateView.delegate = self;
rateView.rate = _rating;
[self.contentView addSubview:rateView];
}
4

2 に答える 2

1

で割り当てても問題layoutSubviewsありませんが、が呼び出されるたび layoutSubviewsに実行しているため、割り当て直後よりも頻繁に呼び出されます。そのため、現在の方法ではメモリ リークがひどくなります (ARC を使用していない場合)。さらに、呼び出しごとに常に新しいrateViewオブジェクトを追加することになりcontentView、望ましくない結果が生じます。

サブビューはセル ビューによって所有されているため、セル ビューを再利用すると、セル ビューも再利用されます。

代わりに、サブビューが存在するかどうかを確認し、それに応じて割り当てます。

- (void)layoutSubviews
{
    [super layoutSubviews];

    if ( rateView == nil ) {
        rateView = [[DYRateView alloc] initWithFrame:CGRectMake(...) fullStar:[UIImage imageNamed:@"..."] emptyStar:[UIImage imageNamed:@"..."]];

        // rest of rateView set up here

       [self.contentView addSubview:rateView];
    }
}
于 2012-06-26T16:46:31.227 に答える
0

再利用するだけだと思います。自分でテストできます

NSLog(@"レイアウト サブビュー、保持カウントは %d", rateView.retainCount);

とはいえ、カスタム セルの init メソッドでこれを行ってみませんか? そして、フレームをlayoutSubviewsに設定するだけですか?よりきれいに見えます。

于 2012-06-26T16:46:32.930 に答える