应用程序在UITableview中加载大量数据时崩溃

时间:2012-02-07 10:28:02

标签: objective-c ios cocoa-touch uitableview

我在uitableview单元格中显示超过10列并且有超过100行,但是当我滚动tableview或重新加载表时,它收到了内存警告,应用程序崩溃了。 我们也在使用折叠和扩展此表视图。

以下代码应用于cellforrowatindexpath

for(i=0;i<[appDel.tempItemDic count];i++)
{                  
    UILabel *label = [[UILabel  alloc] initWithFrame:CGRectMake(CNT+30, -30, 350,100)];
    label.font = [UIFont systemFontOfSize:14.0];
    label.text =[tempDic objectForKey:[appDel.arrColumnList objectAtIndex:[[appDel.tempArr objectAtIndex:i]intValue]]];
    label.textAlignment = UITextAlignmentLeft;
    label.textColor = [UIColor whiteColor];
    label.backgroundColor=[UIColor clearColor];
    label.numberOfLines=1;
    [cell.contentView addSubview:label]; 
    [label release];

    backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"ListItems_secondLevel(3).png"]];
    cell.backgroundView = backgroundView;
    cell.imageView.image=[UIImage imageNamed:@"arrow.png"];
    CNT+=350;
}

4 个答案:

答案 0 :(得分:0)

您只需在创建单元格时创建UILabel。在重用单元格时,您可以使用tag获取UILabel并将值设置为该值。不要一次又一次地创造。

修改: 除此之外,正如Sarah所提到的,你不需要在循环中这样做。至于调用该方法的每个单元格,您可以根据indexPath设置该值。

答案 1 :(得分:0)

您在方法中不需要for loop。由于objectatIndex适用于此。删除for循环,因为您已经在使用objectAtIndex并重试。

答案 2 :(得分:0)

可能你没有重复使用这个细胞。因此,如果您创建了100个单元格,并且每个单元格都有10个标签,那么UILabel视图将保留在内存中。 你应该以这种方式重用单元格(代码没有经过测试,只是为了给你一个想法,我不是在评论你创建文本的方式,我只关心内存警告):


-(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  // add your code here to get the number of columns; I assume you defined a "getNumberOfColumnsForRowAtIndexPath:" somewhere in your code to retrieve this figure
  NSInteger numberOfColumns = [appDel getNumberOfColumnsForRowAtIndexPath:indexPath];
  NSString *cellId=[NSString stringWithFormat:@"MyComplexCellID_%d",numberOfColumns];
  UITableViewCell *cell = [tv dequeReusableCellWithIdentifier:cellId];
  if(!cell) {
    // here you create the cell and add the labels; DON'T GIVE TEXT TO THE LABELS HERE
    // in order to get the right label give them a tag; e.g. 500 is column 0, 501 column 1,... 
    for(int i=0;i<numberOfColumns;i++) {
      UILabel *myLabel = ...
      myLabel.tag=500+i;
    }
  }
  // here you configure the cell
  for(int i=0;i<numberOfColumns;i++) {
    NSString *columnText = retrieve here your column text;
    UILabel *labelColumn = (UILabel *)[cell.contentView viewWithTag:500+i];
    labelColumn.text = columnText;
  }

  return cell;

}

答案 3 :(得分:0)

如果您在表格视图中加载大量数据,我会建议您

1: -

(void)viewDidLoad {
    [super viewDidLoad];


dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableview reloadData];
});


}

2: -

(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);


dispatch_async(q, ^{

    NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH - Main Thread");

    [self methodForServerResponse];
});



}

在那个methodForServerResponse -

(void)methodForServerResponse{

  dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);



dispatch_async(q, ^{

    NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH - Main Thread within Main Thread");

    //implement what you stuff need from server 
});