琐碎代码上的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】琐碎代码上的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS on trivial code 【发布时间】:2011-07-06 14:21:38 【问题描述】:

这是代码:

UITabBarController *tbc = [[UITabBarController alloc]init];
tbc.viewControllers = [NSArray arrayWithObjects:ptlc,cvc,gvc,nil];
[self.navigationController pushViewController:tbc animated:YES];
[tbc release];

这是 tableView:didSelectRowAtIndexPath: 中代码的最后一部分。选择行时,UITabarController显示精细,但在击中UIinavigationController上的“返回”按钮时,程序会在第二秒后崩溃,而无需打印控制台上的任何描述。调试器只是指向我“线程 1:程序接收到的信号:“EXC_BAD_ACCESS”。”在这一行:

 int retVal = UIApplicationMain(argc, argv, nil, nil);

在“main.m”上。令人难以置信的是,删除最后一行解决了这个问题。 ptlc cvc 和 gvc 是我首先分配并在此代码示例的最后一行之后释放的控制器。

【问题讨论】:

【参考方案1】:

使用配置文件工具“僵尸”自己解决了这个问题。它向我展示了 UIImage 在被释放后正在接收释放消息。这是因为我在 UITabBar 上为两个不同的 UITabBarItem 使用了相同的 UIImage。

【讨论】:

【参考方案2】:

由于该代码没有明显的错误,因此请记住;它让我相信它正在发生,因为您不应该在 UINavigationController 堆栈中使用 UITabBarController 作为视图控制器。来自UITabBarController 上的 Apple 文档:

在创建标签栏界面之前,您需要确定您打算如何使用它。因为它为您的数据强加了一个总体组织,所以只有少数几种适当的方法可以使用标签栏界面:

直接在应用程序的主窗口中安装它。 将其安装为拆分视图界面中的两个根视图之一。 (仅限 iPad) 以模态方式呈现它以显示一些需要其自己的基于模态组织的数据。 从弹出框显示它。 (仅限 iPad)

【讨论】:

UITabBarController 肯定可以在 UINavigationController 中使用。我已经看过很多次了。我所知道的是它不能以其他方式完成(在标签栏中导航)。 @Hallucynogenyc 引自here:“虽然导航控制器可以嵌入到选项卡中,但反之则不然。从导航界面中呈现选项卡栏界面可能会使用户感到困惑。 "不建议在导航堆栈中使用标签栏。 Deepak 是对的,正如我在上面解释的那样。但由于这是一个糟糕的访问问题,一个好的提示是打开 NSZombie 并查看问题发生在哪里。 我在斯坦福 iPhone 应用程序开发课程 (CS193P) 中看到了这一点。我可以相信不推荐这种用法,但在我的项目中它是必须的。不过,这不是问题的重点。它不应该抛出错误,它应该告诉我错误是在哪里产生的,而不是告诉我它是在 main.m 中产生的,不是吗? 这通常意味着某些东西在发布后被调用,像我说的那样打开 NSZombie(搜索 xcode 4 NSZombie 应该会得到它),然后看看它在哪里崩溃了。可能还想尝试 Xcode 4 分析功能

以上是关于琐碎代码上的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

[0] CV Notes - 琐碎

面向对象的琐碎特性

SCCM 2012 的一些琐碎事情

为啥 clang 处理这个琐碎的 std::variant 代码的异常?

这种使用不安全的琐碎安全吗?

iOS 琐碎点------切某个或某几个角的圆角