参照here的问题。“EXC_BAD_ACCESS:无法恢复先前选定的框架” - 堆栈变量未清理
在该线程提供的解决方案,包括:
- 聪明在哪里,有多少变量声明,将进入堆叠。
- 如果需要禁用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:原来,在这种情况下,这是我的错。详情请参阅我的回答。对不起浪费人们的时间。 :\
这些问题与静态分配的对象和纯粹自动释放的对象有关,而不是定制发布的对象,所以我怀疑ARC会有所帮助。如果有帮助,我可以用一些示例代码编辑问题。 – 2012-02-16 03:44:31