NSMutableArray, вызывающий сбой EXC_BAD_ACCESS после того, как viewcontroller действительно исчез и снова появляется - PullRequest
0 голосов
/ 08 октября 2010

Все еще "несколько" новичка ... У меня есть NSMutableArray, который хранит имена файлов - когда пользователь щелкает UITableView, соответствующая выбранная ячейка передает определенное имя файла в массиве в MPMoviePlayerController для воспроизведения. Это работает, однако, если я выхожу из viewcontroller и возвращаюсь, будет работать только последнее видео, которое я проиграл, если я выберу любую другую запись в таблице, я получаю сбой с "EXEC_BAD_ACCESS". Итак, я предполагаю, что массив освобождается, когда исчезает контроллер представления Вот код:

сначала: "NSMutableArray * filenameArray;" находится в .h файле

(void)viewDidLoad 
{
  [super viewDidLoad];
  //filenameArray = [[[NSMutableArray alloc]    initWithCapacity: 500] autorelease];
  filenameArray = [[NSMutableArray alloc] initWithCapacity: 500];    
}

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

  UITableViewCell *cell = [tableView    dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) 
  {
    cell = [[[UITableViewCell alloc]    initWithStyle:UITableViewCellStyleDefault    reuseIdentifier:CellIdentifier]    autorelease];
  }

  // Configure the cell...
  NSString *fullPath = [[NSString alloc] init];
  fullPath = [[_importableVideoDocs    objectAtIndex:indexPath.row]    description];
  NSLog(@"Full path is: %@", fullPath);
  [filenameArray addObject:fullPath];
  NSString *fileName = [fullPath lastPathComponent];
  [fullPath release];

  cell.textLabel.text = fileName;
  return cell;    
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath    *)indexPath 
{
  NSLog(@"Tapping row %d", indexPath.row);
  NSUInteger i = (indexPath.row);
  NSString *test = [[filenameArray objectAtIndex:i] description];

  //CRASH HAPPENS HERE IF VIEW CONTROLLER IS DISMISSED AND THEN    APPEARS AGAIN
  //when view disappears is filenameArray released? do I need to    retain?

  NSLog(@"%@", test);

  moviePlayer = [[[CustomMoviePlayerViewController    alloc] init] autorelease];

  // Show the movie player as modal
  [self presentModalViewController:moviePlayer    animated:YES];

  // Prep and play the movie
  [moviePlayer readyPlayer:test];
}

Итак, мой вопрос для новичка: как мне сохранить это, чтобы остановить сбой EXC_BAD_ACCESS, когда я щелкаю по таблице, когда представление появляется во второй раз? или если я не на правильном пути к ответу, что мне нужно сделать, чтобы остановить этот сбой? Если бы кто-нибудь мог помочь мне с тем, как я мог бы решить это, это было бы очень признательно! Спасибо!

1 Ответ

2 голосов
/ 08 октября 2010

EXC_BAD_ACCESS обычно означает, что вы пытаетесь использовать выпущенную переменную. Если сбой произошел там, где вы указали его, либо массив, либо объект, хранящийся в массиве. Вы можете попробовать добавить больше NSLogs перед сбоем, но, как предположил Ник, отладчик ваш друг.

Если бы мне пришлось угадывать, я бы сказал, попробуйте следующее:

NSString *fullPath = [[NSString alloc] initWithString:[[_importableVideoDocs objectAtIndex:indexPath.row] description]];

Я думаю, что теперь при кодировании вы выделяете строку, а затем пропускаете ее, когда она заменяется описанием. Я думаю, что описание будет выпущено автоматически, поэтому, когда вы его опубликуете, может случиться что-то плохое. Используя initWithString, вы гарантируете правильное сохранение количества.

...