0

我正在尝试解决我的第一个非常困难的 EXC_BAD_ACCESS 问题。我从很多教程和博客中看到,我可以使用 Zombies 来帮助我找出哪里出错了。但我不认为我的僵尸在工作,而且我肯定没有从控制台中得到任何有用的东西。

当我启动程序时,我看到:This GDB was configured as "x86_64-apple-darwin".Setting environment variable "NSZombieEnabled" to null value.

最终,我看到了一些我使用的 NSLog 跟踪,然后:

Program received signal:  “EXC_BAD_ACCESS”.

一点帮助都没有。有任何想法吗?我有一个偷偷摸摸的怀疑,即使僵尸在工作,它也无法告诉我错误的访问发生在哪里。Objective C 让我很难过——这在 ActionScript 中需要 3 秒 :(


你说崩溃就在这里(下次编辑问题):

- (IBAction) toggleView{
if(switchableView.subviews.count != 0)
    [[switchableView.subviews objectAtIndex:0] removeFromSuperview];
UIViewController* newView = (viewSelector.selectedSegmentIndex == 0) ? [Login new] : [UserRegistration new];
[switchableView addSubview:newView.view];
//[newView release];
}
4

2 回答 2

2

实际上,您从控制台中得到了一些有用的东西。它告诉您您尚未启用 NSZombie - “将环境变量“NSZombieEnabled”设置为空值。”

该值必须是 YES 而不是 null。

可执行文件 -> 您的目标名称 -> 参数 -> 要在环境中设置的变量

即使没有启用 NSZombies,也应该非常直接地从调用堆栈中查看错误访问的位置。动作脚本是一种脚本语言。

于 2010-10-31T16:51:57.493 回答
0

没有理由说这个错误一定是由过度释放的对象引起的。您可能会崩溃还有很多其他原因。

Program received signal: “EXC_BAD_ACCESS”.

好的——那么它在哪里崩溃了?什么是回溯?它应该已经崩溃到调试器并且调试器应该向您显示有关崩溃的一堆详细信息。

发布回溯以及恰好在该回溯中的任何代码。


这不是回溯,但确实提供了更多上下文。回溯会很有帮助,因为它将准确显示崩溃发生的位置。

就僵尸而言,我发现使用Run -> Run With Performance Tool -> Zombies菜单项在僵尸检测模式下启动仪器更容易。

当您注释掉时崩溃消失release当然表明内存管理问题。您发布的代码看起来不错,假设您没有覆盖new.

您是否尝试过“构建和分析”?

您得到一个意外的表表明您的代码中[显然]存在其他问题。这也可能包含内存管理问题?

另外 - 如果removeFromSuperview:导致稍后查询所选段的视图释放和解除分配,那也可能导致崩溃。


Objective C 让我难过——这在 ActionScript 中需要 3 秒

当你试图把你不知道的事情当作你知道的不相关的事情来对待时,你会感到悲伤。任何语言、工具或新环境的成功与您的态度和工具的细节一样重要。

我建议您退后一步,学习一些教程和/或阅读一些有关调试应用程序的文档

于 2010-10-31T16:51:53.650 回答