自定义UITableViewCell中的Alloc / init

时间:2012-06-26 16:24:18

标签: objective-c ios uitableview

我正在使用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];
}

2 个答案:

答案 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中设置框架?它看起来更干净。