【发布时间】:2012-02-15 22:32:04
【问题描述】:
参考问题here。
该线程中提供的解决方案包括:
- 明智地了解您声明的变量的位置和数量,这将进入堆栈。
- 如果需要,禁用 Guard Malloc。
另外,一般来说: 3. 确保你释放的是你实际分配内存的变量!!
我没有上述问题。我在函数中使用的堆栈分配变量很少,例如每个函数中的 2-3 个。但是因为函数循环调用了好几次,好像触发了异常。
这就是问题所在,这不仅发生在静态分配的变量中,还发生在堆上!我在自动发布的 NSNumber 变量声明中遇到页面错误,我在循环中使用了几个,以及我在函数范围内明智地分配和释放的字典,每次调用它。
那么为什么会发生这种情况,为什么堆变量会受到影响?完全看不懂,请大家多多指教。 :)
我在 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 开始发生在自动释放的变量上,最后是自定义分配的变量 - 这就是我难住的时候。我一直在遵循内存管理的所有规则,而且我的堆栈和堆变量遍布我的全身。如果它只是堆的东西,或者在循环中堆东西,我可以理解某处有错误。但是在这里,两者都不是,这些完全无辜的变量被分配在一个不在循环中调用的函数内的堆栈上,而常规的自动释放变量永远不会被保留或从代码中的另一个位置抛出。更糟糕的是,故障点是随机的 - 不仅在这个函数中,而且在项目执行过程中几乎每一个都被多次调用。
Edit2: 原来,在这种情况下,是我的错。有关详细信息,请参阅我的答案。很抱歉浪费了人们的时间。 :\
【问题讨论】:
标签: iphone xcode xcode4.2 internal