重新加载包含UITableView的UIViewController时EXEC_BAD_ACCESS

时间:2009-05-14 02:21:49

标签: iphone uitableview uiview

执行以下步骤时,我得到一个EXEC_BAD_ACCESS:

第1步:点击主菜单中的“分数”按钮 这将删除菜单(UIView),并加载Scores(UIView),随后启动使用值填充UITableView的过程。这里没问题。

            self.viewController4 = [[ScoresViewController alloc]  initWithNibName:@"ScoresViewController" bundle:nil];
        [window addSubview:viewController4.view];
        [viewController.view removeFromSuperview];
        NSLog(@"LOADING SCORES SCREEN");

第2步:点击“得分屏幕”中的“菜单”按钮 这将删除分数(UIView),并再次加载菜单(UIView)。这里没问题。

self.viewController = [[MainMenuViewController alloc] initWithNibName:@"MainMenuViewController" bundle:nil];
        [window addSubview:viewController.view];
        [viewController4.view removeFromSuperview];
        NSLog(@"Loading MAIN MENU");

第3步:再次点击主菜单中的“分数”按钮 同样,这将删除菜单(UIView),并加载Scores(UIView),随后启动使用值填充UITableView的过程。的 有问题!

应用程序在显示分数屏幕(UIView)之前崩溃。使用调试器我将问题追溯到单行代码: cell.text = [self-> theScoresArray objectAtIndex:indexPath.row]; 出现在以下例程中:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [theTable dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
cell.text = [self->theScoresArray objectAtIndex:indexPath.row];
return cell;
}

这可能是第一次没有正确释放indexPath对象的问题吗?任何见解都会有所帮助。谢谢你宝贵的时间。

2 个答案:

答案 0 :(得分:1)

在再次点击“分数”按钮之前是否发布了“theScoresArray”?将鼠标悬停在“theScoresArray”上,看看它是否有值。

答案 1 :(得分:1)

我认为你的问题在于你使用UIWindow ......

您不应该直接删除/添加视图到应用程序中的UIWindow实例。

如果您打算展示多个视图,则应该:

  1. 使用UINavigationController或 UITabViewController。
  2. 添加和删除 您单身中的UIView的子视图 查看应用程序。
  3. 如果您不使用这些模式(即viewDidLoad,viewDidDisappear等等),UIApplication需要知道屏幕视图是谁以及某些委托消息可能会丢失。

    我在尝试管理自己的观点时遇到了类似的问题。

    听起来在您的实例中,您应该使用UINavigationController并推送和弹出视图控制器。它管理所有初始化,缓存和解除分配。这应该会减少问题。

    看起来你可以“滚动你自己”,但与学习使用它的惯例相比,打击SDK会更难。