我正在使用DYRateView在自定义UITableViewCell
课程中显示星级评分视图。 DYRateView的一个实例(UIView的子类)在我的`layoutSubviews'方法中被分配和初始化。
在`layoutSubviews'中分配/初始化视图是不好的做法?当重用单元时,是否在每个单元中分配/ init或重用视图?
·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];
}
答案 0 :(得分:1)
可以在layoutSubviews
中分配它,但是每次调用 <{strong> 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];
}
}
答案 1 :(得分:0)
我相信它会重复使用它。你可以自己测试一下
NSLog(@“布局子视图,保留计数为%d”,rateView.retainCount);
虽然,为什么不在自定义单元格的init方法中执行此操作?只需在layoutSubviews中设置框架?它看起来更干净。