2012-02-15 15 views
1

参照here的问题。“EXC_BAD_ACCESS:无法恢复先前选定的框架” - 堆栈变量未清理

在该线程提供的解决方案,包括:

  1. 聪明在哪里,有多少变量声明,将进入堆叠。
  2. 如果需要禁用Guard Malloc。

而且,一般而言: 3.确保你释放你实际上是分配的内存变量!

我没有上述问题。我在函数中使用的堆栈分配的变量非常少,每个变量都有2-3个。但是因为函数在循环中被调用了好几次,它似乎会触发一个异常。

这里是踢球者,这不仅仅发生在静态分配的变量上,而且还在堆上!我在自动发布的NSNumber变量声明中发现了页面错误,这些变量我在循环中使用了几个变量,还有一个字典,我每次调用它时都会在函数范围内分配和释放字典。

那么为什么会发生这种情况,为什么heck变量会受到影响?我一点都不明白,请在此点亮一下。 :)

我在IOS5与XCode 4.2,iPhone/iPad模拟器。

谢谢!

问候, 开发

编辑:示例代码
- (void)doSomething {
NSInteger fun = 3;
NSInteger time = 4;
NSInteger overload = fun*time;
NSString *string = [NSString stringWithFormat:@"%d",overload];
NSObject *myCustomObject = [[NSObject alloc] init];
[myCustomDictionary setObject:myCustomObject forKey:string];
[myCustomObject release];
//myCustomDictionary is an iVar, alloced in the class's init method, and released in dealloc and not touched anywhere in between
}
//doSomething gets called several times through the course of execution as the state of the view changes, the user interacts with it etc, often 2-3 times during one state change.

的代码是故意模糊的,但在同一时间,这是完全一样的样品中一样简单。正如整个项目的其他代码一样。几个功能,每个都做少量的工作,就像这一个很好的自我包含记忆一样。

我之前遇到过EXC_BAD_ACCESS问题,并且在那个时候提到了this问题。然而就我而言,我并没有在一个循环内的堆栈上创建多个变量,而是通过一个在执行过程中多次调用的函数重复创建它们。理想情况下,变量应该在函数范围的末尾被销毁。不知道为什么没有发生。

无论如何,为了解决这个问题,为了防止发生多次分配,我最终声明了我的堆栈分配变量全部为static。这是不好的做法,但这正是我必须做的工作。它一直在运转,直到我终于用“doSomething”函数面对这个问题。

所以“doSomething”的困难在于我没有创建堆栈分配的变量,而是堆了一些东西。所以我首先开始在NSInteger变量上获取EXC_BAD_ACCESS,在这一点上,我试着再次修复它,声明它们是静态的。它的工作,但现在EXC_BAD_ACCESS开始发生在自动释放变量,最后是自定义分配的变量 - 这是当我陷入困境。我一直遵循内存管理的所有规则,而且我有堆栈和堆变量在我身上流窜。如果只是堆东西,或者将东西堆放在一个循环中,我可以理解某处有错误。但是在这里,它既不是,也不是在循环中调用的ONE函数内的堆栈中分配的完全无辜的变量,以及从未获得的常规自动释放变量将保留或释放到代码中的其他位置。更糟糕的是,失败点是随机的 - 不仅仅是在这个功能中,实际上每一个在项目执行过程中被调用了几次。

编辑2:原来,在这种情况下,这是我的错。详情请参阅我的回答。对不起浪费人们的时间。 :\

回答

0

啊geez我不相信这一点。

以前用堆栈分配的NSInteger变量面临的问题是成立的,但在这种情况下,这完全是我的错。

“DoSomething的”是事件的长链的一部分,即,由于对我而言有些愚蠢的过失,结束了循环一堆倍,这是什么,理所当然,当它应该是,导致应用程序内存不足。无论是堆栈变量还是坐在堆上的混合变量,无限循环,都会以某种方式崩溃。 :)

因此,崩溃是完全公平的,只是在这种情况下与以前的问题,结果是无关的混淆。 :(

对不起,浪费大家的时间。

0

没有张贴在你的问题的任何代码,看到你正在使用的是iOS 5和Xcode的4.2我最好的建议对你的,在Xcode,去Edit>Refactor>Convert to Objective-C ARC和波所有的内存管理问题再见。

ARC为您做所有的内存管理。您不需要保留,发布或编写dealloc方法。在大多数情况下,您不必担心内存管理。你将离开神秘的EXC_BAD_ACCESS崩溃。它的工作方式是超高效的。编译器会为您保留并发布,然后进行优化。你甚至不需要看代码。

+0

这些问题与静态分配的对象和纯粹自动释放的对象有关,而不是定制发布的对象,所以我怀疑ARC会有所帮助。如果有帮助,我可以用一些示例代码编辑问题。 – 2012-02-16 03:44:31

1

我们不能真正帮助你没有看到整个堆栈跟踪。 EXC_BAD_ACCESS并不意味着为了解决我们需要知道的例外是什么东西。 。

根据我的经验,当你没有得到一个堆栈tarce这意味着你是双释放僵尸是要找到你的双重释放的方式

转到:Product -> Profile,然后选择“Zombies”从清单 运行应用程序并执行导致崩溃的任何任务,如果问题是双重发布,则会显示弹出窗口。选择弹出框中的箭头,它会告诉你到底是什么对象被双重释放,并向您显示保留周期。

+0

请参考我的回答。我现在无法接受它,因为看起来我只能在提问后两天接受我自己的回答,或者类似的问题。 – 2012-02-16 11:18:52

+0

正如我所提到的,僵尸将适用于在堆中声明的对象。我也面临着与STACK变量相同的问题,所以它不是保留/发布问题,就像应用程序在无限循环的x次迭代后内存耗尽一样,我的答案中已澄清。 – 2012-02-16 11:20:26