Objective c 自定义UITableViewCell中的Alloc/init

Objective c 自定义UITableViewCell中的Alloc/init,objective-c,ios,uitableview,Objective C,Ios,Uitableview,我使用在自定义UITableViewCell类中显示星级视图。DYRateView的一个实例(UIView的子类)在我的“layoutSubviews”方法中被分配和初始化 在“layoutSubviews”中alloc/init视图是一种不好的做法吗?当单元被重用时,它是在每个单元中alloc/init还是重用视图 h m 在layoutSubviews中分配它是可以的,但是每次调用layoutSubviews时,您都会执行,并且调用它的频率会比分配后更高。因此,您现在使用的方式将严重泄漏内存

我使用在自定义
UITableViewCell
类中显示星级视图。DYRateView的一个实例(UIView的子类)在我的“layoutSubviews”方法中被分配和初始化

在“layoutSubviews”中alloc/init视图是一种不好的做法吗?当单元被重用时,它是在每个单元中alloc/init还是重用视图

h

m


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];
    }
}

我相信它只会重复使用。你可以自己测试

NSLog(@“布局子视图,保留计数为%d”,rateView.retainCount)


尽管如此,为什么不在自定义单元格的init方法中执行此操作呢?然后在布局子视图中设置框架?它看起来更干净。

您指的是这种方法吗<代码>-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier由于某种原因,当我实现此方法时,它从未被调用。这可能是我使用故事板的b/c吗?可能,是否调用了-(id)init{}?您所要做的就是在cellForRow中查看单元格是如何创建的。
- (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];
}
- (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];
    }
}