在viewcontroller消失并重新出现后,NSMutableArray导致EXC_BAD_ACCESS崩溃

时间:2010-10-08 04:43:42

标签: iphone ios nsmutablearray exc-bad-access

仍然“有些”新手......我有一个存储文件名的NSMutableArray - 当用户点击UITableView时,相应的选定单元格会将数组中的某个文件名传递给MPMoviePlayerController进行播放。它工作正常,但是如果我退出视图控制器并返回,只有我播放的最后一个视频将起作用,如果我选择任何其他表项,我会遇到“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 个答案:

答案 0 :(得分:2)

EXC_BAD_ACCESS通常意味着您正在尝试使用已发布的变量。如果崩溃发生在您指示其数组或对象存储在数组中的位置。您可以尝试在崩溃前添加更多NSLog,但正如Nick建议的那样,调试器是您的朋友。

如果我不得不猜测,我会说尝试以下内容:

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

我认为你编码它的方式现在会分配一个String,然后在它被描述替换时泄漏它。我认为这个描述是自动释放的,所以当你稍后发布它时可能会发生不好的事情。通过使用initWithString,您可以确保正确的保留计数。