为什么不释放tablecells?

时间:2009-08-03 19:13:25

标签: iphone uitableview

我简化了我的代码以便进行测试,并且在手机上我的内存使用量不断攀升到桌子减速的程度。

有人能告诉我这里的错误吗?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 40;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellID = @"Cell";
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease];
    }
    UILabel *l=[[UILabel alloc] initWithFrame:CGRectMake(10,10,300,16)];
    l.font=[UIFont boldSystemFontOfSize:15];
    l.textColor=[UIColor whiteColor];
    l.backgroundColor=[UIColor blackColor];
    l.text=@"Just some randoom text here";
    [cell.contentView addSubview:l];
    [l release];

糟糕。该代码粘贴效果不佳。这是一个直接粘贴:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 40;
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellID = @"Cell";
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease];
    }
    UILabel *l=[[UILabel alloc] initWithFrame:CGRectMake(10,10,300,16)];
    l.font=[UIFont boldSystemFontOfSize:15];
    l.textColor=[UIColor whiteColor];
    l.backgroundColor=[UIColor blackColor];
    l.text=@"Just some randoom text here";
    [cell.contentView addSubview:l];
    [l release];
        return cell;
}

3 个答案:

答案 0 :(得分:1)

您需要遵循以下模式:

#define kTagMyLabel 1

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
  static NSString *cellID = @"Cell1";
  UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID];
  UILabel * l;
  if (cell == nil) {
    // create the cell
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease];

    // perform setup/functions that are common to all cells
    l = [[[UILabel alloc] initWithFrame:CGRectMake(10,10,300,16)] autorelease];
    l.font=[UIFont boldSystemFontOfSize:15];
    l.textColor=[UIColor whiteColor];
    l.backgroundColor=[UIColor blackColor];
    l.tag = kTagMyLabel ;
    [cell.contentView addSubview:l];
  }
  else
  {
    // find the label we previously added.
    l = (UILabel*)[cell viewWithTag:kTagMyLabel];
  }

  // now set up the cell specific to this indexPath
  l.text=@"Just some random text here";
  return cell;
}

答案 1 :(得分:0)

您正在回收UITableViewCell实例,但您仍在为每一行创建一个新的UILabel实例,并将其添加到每个单元格。这是内存使用的来源。尝试这样的事情:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellID = @"Cell";
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellID] autorelease];
        UILabel *l=[[UILabel alloc] initWithFrame:CGRectMake(10,10,300,16)];
        l.font=[UIFont boldSystemFontOfSize:15];
        l.textColor=[UIColor whiteColor];
        l.backgroundColor=[UIColor blackColor];
        l.text=@"Just some randoom text here";
        [cell.contentView addSubview:l];
        [l release];
    }
    return cell;
}

答案 2 :(得分:0)

由于每个UITableViewCell都有自己的标准UILabel(cell.textLabel),你真的需要在contentView中添加额外的标签吗?如果您需要自定义单元格,则可能需要考虑对UITableViewCell进行子类化。