自定义UITableviewCell放弃内存问题

时间:2014-07-10 06:47:59

标签: ios iphone objective-c uitableview instruments

目前,我正在尝试使用乐器数据优化我的iOS应用。我注意到我的一个UITableViewCell存在问题,如果点击上面的单元格,我会插入或删除它。问题是我的细胞似乎没有在cellForRowAtIndexPath中被回收,但是创建了一个全新的细胞,之前创建的细胞被遗弃并留在内存中。这导致了一个主要问题,因为每个单元花费大约2mb,因此使用大量内存非常容易,只需打开和关闭单元就可以超过100mb。如下图所示。

我的自定义UITableViewCell包含

  • UIScrollView
    • 自定义UIView(图表视图)
  • 自定义UIView(轴视图)

其他一些信息

  • 使用带有UIScrollView和其他控件(未在代码中显示)的原型单元格
  • GraphicView子类uiview并使用drawRect绘制图形。

我不确定我是否使用了正确的方法,因为用户最常在屏幕上同时只有一个单元格。我的问题是我的代码有什么问题,为什么我要使用这么多内存,我该如何解决?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([self.prices[indexPath.row] isEqual:@(1)])
    {
        static NSString *CellIdentifier = @"statCell";
        PTPriceStatCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        int width = kOffsetX + dateRangeInDays * kStepX + kOffsetX;
        float axisWidth = //Some calculataion;

        cell.scrollView.frame = CGRectMake(0,0,cell.frame.size.width - axisWidth, 128);

       GraphView *graphView = [[GraphView alloc]initWithFrame:CGRectMake(axisWidth, 0, width , cell.scrollView.frame.size.height)];

        graphView.range = dateRangeInDays;
        graphView.xValues= xAxis;
        graphView.yValues = yAxis;
        graphView.earliestDate = earliestDate;


        [cell.scrollView addSubview:graphView];

        CGPoint bottomOffset = CGPointMake( cell.scrollView.contentSize.width - cell.scrollView.bounds.size.width,0);
        [cell.scrollView setContentOffset:bottomOffset animated:NO];
        YAxis *axisView = [[YAxis alloc]initWithFrame:CGRectMake(0, cell.scrollView.frame.origin.y, axisWidth, cell.scrollView.frame.size.height)];

        axisView.yValues = yAxis;
        [cell.contentView addSubview:axisView];
        cell.scrollView.contentSize = CGSizeMake(cell.scrollView.graphView.frame.size.width + axisWidth, cell.scrollView.graphView.frame.size.height);

        return cell;
    }
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath     *)indexPath
{
    if (range < [self.prices count] && [[self.prices objectAtIndex:range] isEqual:@(1)])
    {
          [self.prices removeObjectAtIndex:range];
          [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
     }
     else
     {
         Price *currentPrice = self.prices[[self getPricePositionFor:(int)indexPath.row]][0];
         if (currentPrice.value != nil) 
         {
             [self.prices insertObject:@(1) atIndex:range];
             [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
         }
     }
}

Instruments analysis

2 个答案:

答案 0 :(得分:1)

您将可重复使用的单元格排队,但继续向其添加graphViewsaxisViews。因为它们从未从细胞中移除,所以它们正在相加。

如果您要么a)检查单元格中是否已存在这些视图并仅重新配置它们,或b)在-prepareForReuse上实施PTPriceStatCell并清理单元格&#39>该问题应该消失那里的子视图。

最小清理示例:

NSArray *oldGraphs = [cell.scrollView.subviews filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id subview, NSDictionary *bindings) {
    return [subview isKindOfClass:[GraphView class]];
}]];
[oldGraphs makeObjectsPerformSelector:@selector(removeFromSuperview)];

答案 1 :(得分:0)

让GraphView和AxisView作为PTPriceStatCell的属性。并使用cell.graphView或cell.axisView访问。您的代码每次都会实例化它们,并且永远不会释放它们。