EXEC_BAD_ACCESS с cellForRowAtIndexPath, снова - PullRequest
0 голосов
/ 12 августа 2010

У меня другая проблема с UITableView, приложение вылетает после перезагрузки 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 ]

2 голосов
/ 12 августа 2010

похоже, что вы используете venueName без инициализации его в ситуациях, когда вы используете ячейку повторно.

У вас есть:

UILabel *venueName;

, а затем:

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

в ситуациях, когда вы выделяете ячейку, вы устанавливаете venueName, но когда ячейка используется повторно, это не происходит.Для исправления нужно просто:

UILabel *venueName = nil;
0 голосов
/ 12 августа 2010
  1. Вы пробовали строить и анализировать?Иногда это может помочь с такими вещами.
  2. Попробуйте инициализировать venueName до нуля, когда вы объявите это.Временные переменные в C не инициализируются по умолчанию, поэтому ваш if (!venueName) может быть обойден, если вы этого не хотите.
0 голосов
/ 12 августа 2010

Я бы рискнул предположить, что ваш self.venueList содержит недопустимые указатели и поэтому вылетает при разыменовании в помеченной вами строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...