再次使用cellForRowAtIndexPath EXC_BAD_ACCESS

时间:2010-08-11 20:35:59

标签: iphone xcode uitableview

我遇到了UITableView的另一个问题,在从Internet加载数据后重新加载tableView后应用程序崩溃,崩溃发生在cellForRowAtIndexPath方法中的标记位置。 我知道,我仍然不完全明白回收细胞究竟是什么意思。 谢谢你的帮助

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
 static NSString *CellIdentifier = @"Cell";

 UILabel *venueName;
 UIImageView *logo;

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) 
 {
  NSLog(@">>> GIT 1<<<");
  cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

   venueName = [[UILabel alloc] initWithFrame:CGRectZero];
   [venueName setLineBreakMode:UILineBreakModeWordWrap];
   [venueName setMinimumFontSize:FONT_SIZE];
   [venueName setNumberOfLines:0];
   [venueName setFont:[UIFont systemFontOfSize:FONT_SIZE]];
   [venueName setTag:1];
   venueName.backgroundColor = [UIColor clearColor];
   [[cell contentView] addSubview:venueName];

   logo = [[UIImageView alloc] initWithFrame:CGRectZero];
   [logo setTag:10];
   [[cell contentView] addSubview:logo];

   cell.backgroundView = [[[UIImageView alloc] init] autorelease];//new
 }

 NSMutableDictionary *oneVenue ;

 if ([self.venueList count] > 0) {

  oneVenue = [self.venueList objectAtIndex:indexPath.row];

  if (!venueName) {
   venueName = (UILabel*)[cell viewWithTag:1];
  }
  [venueName setText:[oneVenue objectForKey:@"Name"]]; // <===CRASH!!!
  [venueName setFrame:CGRectMake(CELL_CONTENT_MARGIN,CELL_VENUE_LEVEL ,80 , 30)];

  [logo setImage:[UIImage imageNamed:@"event.png"]];
  [logo setFrame:CGRectMake(10, 5, 76, 60)];

  cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

  UIImage *rowBackground;

  rowBackground = [UIImage imageNamed:@"evbgd_yell.png"];

  ((UIImageView *)cell.backgroundView).image = rowBackground;
 }

 return cell;
}

3 个答案:

答案 0 :(得分:2)

看起来你正在使用venueName而没有在重复使用单元格的情况下初始化它。

你有:

UILabel *venueName;

然后再说:

[venueName setText:[oneVenue objectForKey:@"Name"]]; // <===CRASH!!!

在您分配要设置venueName的单元格的情况下,但是当重用单元格时,它不会发生。要修复你应该只需要:

UILabel *venueName = nil;

答案 1 :(得分:0)

我猜测你的self.venueList包含无效的指针,因此在您标记的行上取消引用时会崩溃。

答案 2 :(得分:0)

  1. 您是否尝试过构建和分析?它有时可以帮助解决这个问题。
  2. 在声明时尝试将venueName初始化为nil。默认情况下,C中的临时变量未初始化,因此当您不希望它时,您的if (!venueName)可能会被绕过。