重新加载包含 UITableView 的 UIViewController 时的 EXEC_BAD_ACCESS
Posted
技术标签:
【中文标题】重新加载包含 UITableView 的 UIViewController 时的 EXEC_BAD_ACCESS【英文标题】:EXEC_BAD_ACCESS upon re-loading a UIViewController containing a UITableView 【发布时间】:2009-05-14 02:21:49 【问题描述】:执行以下步骤时,我得到一个 EXEC_BAD_ACCESS:
第 1 步:点击主菜单中的“分数”按钮: 这将删除菜单 (UIView),并加载分数 (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),并加载分数(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 对象的问题吗?任何见解都会有所帮助。感谢您宝贵的时间。
【问题讨论】:
【参考方案1】:我认为您的问题在于您对 UIWindow 的使用...
您不应将视图直接删除/添加到应用中的 UIWindow 实例。
如果您计划显示多个视图,您应该:
-
使用 UINavigationController 或
UITabViewController。
添加和删除
单中 UIView 的子视图
查看应用。
UIApplication 需要知道屏幕上的视图是谁,如果您不使用这些模式(即 viewDidLoad、viewDidDisappear 等),某些委托消息可能会丢失。
我在尝试管理自己的视图时遇到了类似的问题。
听起来在您的实例中您应该使用 UINavigationController 并推送和弹出视图控制器。它为您管理所有初始化、缓存和解除分配。这应该会导致更少的问题。
您似乎可以“自己动手”,但与 SDK 抗争可能比学习使用它的约定更难。
【讨论】:
你是对的。我彻底检查了我的 View 管理结构,问题就消失了。不过,为什么这到底是个问题仍然是个谜。我很感激帮助。谢谢。 没问题,这是一个艰难的教训。 Apple 在 UIViewController 的“幕后”做了很多工作,迫使你使用他们的约定。【参考方案2】:“theScoresArray”是否在您再次单击“Scores”按钮之前发布?悬停在“theScoresArray”上,看看它是否有值。
【讨论】:
是的,“theScoresArray”在 UIView 从 Superview 中移除之前被释放。从窗口中删除视图并在每次切换屏幕时添加它们是否会出错? UITableView 包含在 UIView 拥有的 UIScrollView 中。我只是使用 UIViewController 子类直接与所述 UITableView 对话。 在为窗口添加子视图后,您需要为“theScoresArray”添加值。 [窗口添加子视图:viewController4.view]; viewController4.theScoresArray=...以上是关于重新加载包含 UITableView 的 UIViewController 时的 EXEC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableView 中的 UINib 中重新加载 UITableView
UITableView reloadRowsAtIndexPaths 不断地重新加载单元格
重新加载UITableView数据后,indexPathForCell返回null
当 presentviewcontroller 或 pushviewcontroller 时 UITableView 被重新加载