-1

我正在使用DYRateViewUITableViewCell在自定义类中显示星级视图。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 回答