目前,我正在尝试使用乐器数据优化我的iOS应用。我注意到我的一个UITableViewCell存在问题,如果点击上面的单元格,我会插入或删除它。问题是我的细胞似乎没有在cellForRowAtIndexPath中被回收,但是创建了一个全新的细胞,之前创建的细胞被遗弃并留在内存中。这导致了一个主要问题,因为每个单元花费大约2mb,因此使用大量内存非常容易,只需打开和关闭单元就可以超过100mb。如下图所示。
我的自定义UITableViewCell包含
UIScrollView
UIView
(图表视图)UIView
(轴视图)其他一些信息
UIScrollView
和其他控件(未在代码中显示)的原型单元格我不确定我是否使用了正确的方法,因为用户最常在屏幕上同时只有一个单元格。我的问题是我的代码有什么问题,为什么我要使用这么多内存,我该如何解决?
- (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];
}
}
}
答案 0 :(得分:1)
您将可重复使用的单元格排队,但继续向其添加graphViews
和axisViews
。因为它们从未从细胞中移除,所以它们正在相加。
如果您要么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访问。您的代码每次都会实例化它们,并且永远不会释放它们。