【问题标题】:How to avoid data being copied to UITableViewCell?如何避免数据被复制到 UITableViewCell?
【发布时间】:2014-10-13 23:24:03
【问题描述】:

我有一个数组,其中包含我想在表格视图中显示的图表。由于绘制图表需要几毫秒,这会使滚动不稳定,我想从重复使用的单元格的 cell.contentView 中删除旧图表,并在滚动时添加一个带有正确图表的新子视图(参见下面的源代码)。这有效:图表正确显示。

但是,当添加子视图时,使用的内存会增加,并且第一次向下滚动是不稳定的(在所有行显示一次后滚动并不不稳定)。

似乎已经存储在实例变量(strong)中的图表数据被复制(不仅仅是引用)到 UITableViewCell 中。

我想避免这种情况,以便使用更少的内存。

总结:如何避免在使用 addSubview 时我的图表被复制到 UITableViewCell 中。相反,我想在使用 addSubview 时仅添加对我的数据的引用。

        static NSString *CellIdentifier = @"chart";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

        if (cell==nil)
        {
            cell = [[UITableViewCell alloc]
                    initWithStyle:UITableViewCellStyleDefault
                    reuseIdentifier:CellIdentifier];
        }

        [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

        VMKChartData *chartData = [shinobiCharts_ objectAtIndex:rowNumber];
        ShinobiChart *shinobiChart = chartData.shinobiChart;
        [cell.contentView addSubview:shinobiChart];

        [self setSeparatorInsets:cell];
        return cell;

【问题讨论】:

    标签: objective-c uitableview memory-leaks charts addsubview


    【解决方案1】:

    不要使用普通的UITableViewCelladdSubview:,而是创建一个具有属性@property (nonatomic, weak) UIView *chartView 的自定义表格视图子类,在tableView:cellForRowAtIndexPath: 中分配它即可。

    cell.chartView = shinobiChart;
    

    在chartView的setter中,将其添加到内容视图中。

    -(void)setChartView:(UIView *)chartView
    {
        [_chartView removeFromSuperview];
        _chartView = chartView;
        [self.contentView addSubView:chartView];
    }
    

    【讨论】:

    • 感谢您的回答。我实现了它,但与我的解决方案相比没有区别。 Xcode 中显示的内存使用情况大致相同。奇怪的是:虽然只显示几个图表时内存使用率不是很高(30-50 MB),但我收到了内存警告。
    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    相关资源
    最近更新 更多