仍然“有些”新手......我有一个存储文件名的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崩溃?或者如果我没有找到答案,我需要做些什么来阻止这次崩溃?如果有人能帮我解决这个问题,我将不胜感激! 谢谢!
答案 0 :(得分:2)
EXC_BAD_ACCESS通常意味着您正在尝试使用已发布的变量。如果崩溃发生在您指示其数组或对象存储在数组中的位置。您可以尝试在崩溃前添加更多NSLog,但正如Nick建议的那样,调试器是您的朋友。
如果我不得不猜测,我会说尝试以下内容:
NSString *fullPath = [[NSString alloc] initWithString:[[_importableVideoDocs objectAtIndex:indexPath.row] description]];
我认为你编码它的方式现在会分配一个String,然后在它被描述替换时泄漏它。我认为这个描述是自动释放的,所以当你稍后发布它时可能会发生不好的事情。通过使用initWithString,您可以确保正确的保留计数。