Iphone “;EXC_坏访问:无法恢复以前选择的帧”;-未清理堆栈变量

Iphone “;EXC_坏访问:无法恢复以前选择的帧”;-未清理堆栈变量,iphone,xcode,xcode4.2,internal,Iphone,Xcode,Xcode4.2,Internal,关于这个问题 该线程中提供的解决方案包括: 在声明变量的位置和数量方面要明智,这将在堆栈上进行 如果需要,禁用保护Malloc 此外,一般而言: 3.确保您正在释放一个实际分配了内存的变量 我没有上述问题。我在函数中使用的堆栈分配变量很少,比如每个函数中使用2-3个。但是,由于函数在循环中被多次调用,它似乎触发了异常 更重要的是,这不仅发生在静态分配的变量上,也发生在堆上!我在循环中使用了两个NSNumber变量的自动发布声明,以及一个字典,每次调用它时,我都会在函数的范围内明智地分配和发布它,

关于这个问题

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

  • 在声明变量的位置和数量方面要明智,这将在堆栈上进行
  • 如果需要,禁用保护Malloc
  • 此外,一般而言: 3.确保您正在释放一个实际分配了内存的变量

    我没有上述问题。我在函数中使用的堆栈分配变量很少,比如每个函数中使用2-3个。但是,由于函数在循环中被多次调用,它似乎触发了异常

    更重要的是,这不仅发生在静态分配的变量上,也发生在堆上!我在循环中使用了两个NSNumber变量的自动发布声明,以及一个字典,每次调用它时,我都会在函数的范围内明智地分配和发布它,这会导致页面错误

    那么为什么会发生这种情况,堆变量为什么会受到影响呢?我一点也不明白,请解释一下

    我在IOS5上使用XCode 4.2,iPhone/iPad模拟器

    谢谢

    问候,, 发展

    编辑:示例代码

    -(无效)剂量{
    NSInteger fun=3;
    NSInteger时间=4;
    NSInteger重载=乐趣*时间;
    NSString*string=[NSString stringWithFormat:@“%d”,重载];
    NSObject*myCustomObject=[[NSObject alloc]init];
    [myCustomDictionary setObject:myCustomObject-forKey:string];
    [myCustomObject发布];
    //myCustomDictionary是一个iVar,在类的init方法中分配,在dealloc中发布,在两者之间的任何地方都没有触及
    }
    //doSomething在执行过程中会被多次调用,因为视图的状态会发生变化,用户会与其交互,等等,通常在一次状态变化期间调用2-3次。

    代码故意含糊不清,但与此同时,它与示例中的代码一样简单。与整个项目中的其余代码一样。几个函数,每个函数都做少量的工作,就像这个函数一样具有良好的自包含内存

    我以前遇到过EXC_BAD_访问问题,当时我提到了这个问题。然而,在我的例子中,我并没有在一个循环中的堆栈上创建多个变量,它们是由一个函数反复创建的,该函数在执行过程中被多次调用。理想情况下,变量应该在函数作用域的末尾被销毁。不知道为什么没有发生

    无论如何,为了解决这个问题并防止发生多次分配,我最终将堆栈分配的变量声明为all
    static
    。这是一种糟糕的做法,但这正是我必须做的,才能让它发挥作用。它一直在工作,直到我用“doSomething”函数再次面对这个问题

    所以“doSomething”的难点在于,我不仅要创建堆栈分配的变量,还要创建堆。因此,我首先开始对NSInteger变量进行EXC_BAD_访问,在这一点上,我再次尝试修复它,将它们声明为静态。它工作了,但是现在EXC_BAD_访问开始在自动发布的变量上发生,最后是自定义分配的变量上发生——这就是我被难倒的时候。我一直遵循内存管理的所有规则,堆栈和堆变量充斥着我。如果只是堆东西,或者在循环中堆东西,我可以理解在某个地方有错误。但在这里,两者都不是,它们都是完全无辜的变量,被分配到一个函数中的堆栈中,而这个函数在循环中没有被调用,它们是常规的自动释放变量,永远不会从代码中的另一个位置被保留或释放。更糟糕的是,失败点是随机的——不仅在这个函数中,而且在项目执行过程中,几乎每个被多次调用的失败点都是随机的


    Edit2:事实证明,在这种情况下,是我的错。有关详细信息,请参阅我的答案。对不起,浪费了大家的时间\

    在您的问题中没有任何代码,并且看到您正在使用iOS 5和Xcode 4.2,我给您的最好建议是,在Xcode中,转到
    Edit>Refactor>Convert to Objective-C ARC
    并挥手告别您所有的内存管理难题


    ARC为您完成所有内存管理。您不需要保留、释放或编写dealloc方法。在大多数情况下,您不必担心内存管理。您将留下神秘的
    EXC\u坏访问
    崩溃。它的工作方式非常高效。编译器为您输入保留和释放,然后进行优化。您甚至不必查看代码。

    如果您的问题中没有任何代码,并且看到您正在使用iOS 5和Xcode 4.2,我给您的最好建议是,在Xcode中,转到
    编辑>重构>转换为Objective-C ARC
    并挥手告别所有令人头痛的内存管理问题


    ARC为您完成所有内存管理。您不需要保留、释放或编写dealloc方法。在大多数情况下,您不必担心内存管理。您将留下神秘的
    EXC\u坏访问
    崩溃。它的工作方式非常高效。编译器为您输入保留和释放,然后进行优化。你甚至不必看代码。

    啊,天哪,我不相信这一点

    前面使用堆栈分配的NSInteger变量所面临的问题仍然存在,但在本例中,这完全是我的错

    “doSomething”是一长串事件的一部分,由于我的一些愚蠢的疏忽,它最终循环了很多次,这是正确的,也是应该的,导致应用程序内存不足。不管是堆栈变量还是malloced变量