内存使用情况与表视图与不同的单元格

时间:2014-01-12 01:09:20

标签: ios objective-c cocoa-touch uitableview

所以我的情况就是这样 - 我有一个表视图,根据我从后端返回的数据,我想绘制不同的单元格。因此,一个表视图可以包含单元格类型A和单元格类型B.

我现在这样做的方式,导致很多内存问题就像这样

-(UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {

if([self.resultsTuples count] != 0){
    NSDictionary* rowData = self.resultsTuples[indexPath.row];
    UITableViewCell* tableCell = [self.resultTable dequeueReusableCellWithIdentifier:CellTableIdentifier];
    UIView* cardView = [cardChooser getCardView:rowData];
    [tableCell.contentView addSubview:cardView];
    return tableCell;
} else {
    return nil;

}
return nil;

}

然后我返回正确的视图 -

-(UIView*)getCardView:(NSDictionary*) component{
if(condition1){
    return [ self getListResultView: component];
} else if (condiiton2){

    return [self getEventResultView: component];
} else if (condition3){

    return [self getProductResultView: component];
} else {
    return [self getGeneralResultView: component];
}
return nil;

}

这里存在许多问题 - 视图控制器超出范围,因此视图不应该工作(它现在只能工作,我认为因为视图控制器尚未被覆盖)。此外,因为我正在使用addSubview,所以保留计数会增加并且这些视图正在四处,因此我的内存使用率不断上升。

现在我有一堆启动xib文件的视图控制器。我想到解决这个问题的一种方法是在表视图控制器中包含那些视图控制器的实例变量,然后在cellForRowAtIndexPath方法中设置这些视图控制器上的字段。

但是,我仍然需要做addSubview,我认为这些内存问题会持续存在。

我该如何解决这个问题?

编辑 -     我的想法是有一个自定义表视图,根据每个条件绘制不同...如果我有50个自定义单元格,这个问题是什么?然后我突然看到了大量难以阅读的绘图代码。

1 个答案:

答案 0 :(得分:0)

我会实现这样的事情:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    BOOL isSupposedToBeCellTypeA = YES;

    // here you'll want to determine if you want cell type A or B....
    BOOL isSupposedToBeCellTypeA = .......

    // if you want A
    if (isSupposedToBeCellTypeA) {
        // attempt to dequeue a cell of that type
        CellTypeA *cellA = [tableView dequeueReusableCellWithIdentifier:@"CellA"];

        // if you can't reuse one, create it
        if (cellA != nil) {
            cellA = [[CellTypeA alloc] init];
        }

        // customize the cell however you need to here...
        cellA.title = @"This is a cell of type A";

        // then return it
        return cellA;
    }

    // otherwise you want B
    else {
        // attempt to dequeue a cell of that type
        CellTypeB *cellB = [tableView dequeueReusableCellWithIdentifier:@"CellB"];

        // if you can't reuse one, create it
        if (cellB != nil) {
            cellB = [[CellTypeA alloc] init];
        }

        // customize the cell however you need to here...
        cellB.title = @"This is a cell of type B";

        // then return it
        return cellB;
    }
}

根据indexPath和数据源执行您需要的任何逻辑,以确定您需要创建FIRST的单元格类型,然后一旦完成,只需要一个简单的if语句即可实现重用/出列代码以及创建/返回适当的单元格。这是假设你已经将子单元子类化并创建了自己的自定义单元格?如果不知道有关细节的更多信息,我不知道我是否能给你一个更好的答案。