我的程序中出现错误“EXC_BAD_ACCESS”

时间:2010-06-03 14:43:58

标签: iphone objective-c

我有一个问题。 当我编译我的程序时没有错误,但是,当我启动它时,这些retern与“EXC_BAD_ACCESS”。 我在调试时查找错误,我在这些方法中找到它,但我不明白...

PS:程序有时进入循环。

-(void)updateMinPosition{

    float valueMinX = 150;
    float valueMinY = 150;
    float valueMinZ = 150;

    NSString *nameMinimoX = [NSString   stringWithFormat:@"default"];
    NSString *nameMinimoY = [NSString   stringWithFormat:@"default"];
    NSString *nameMinimoZ = [NSString   stringWithFormat:@"default"];

    for(int i = 0; i< [arrayPosizioniMovimento count]; i++){

        //Posizione is my class. It contain a NSString name, 3 float valueX, valueY, valueZ
        Posizione *tempPosition;
        tempPosition = [[Posizione alloc]init];

        tempPosition = [arrayPosizioniMovimento objectAtIndex:i];

        if(tempPosition.valueX <= valueMinX){
            valueMinX = tempPosition.valueX;
            nameMinimoX = tempPosition.nome;
        }

        if(tempPosition.valueY <= valueMinY){
            valueMinY = tempPosition.valueY;
            nameMinimoY = tempPosition.nome;
        }

        if(tempPosition.valueZ <= valueMinZ){
            valueMinZ = tempPosition.valueZ;
            nameMinimoZ = tempPosition.nome;
        }

        [tempPosition dealloc];
    }

    labelMinX.text = nameMinimoX;
    labelMinY.text = nameMinimoY;
    labelMinZ.text = nameMinimoZ;   
}

4 个答案:

答案 0 :(得分:4)

看起来可能是[tempPosition dealloc]电话。您正在声明该变量并对其执行alloc / init,然后将其分配给数组中的对象,因此不需要alloc / init。当您在底部调用dealloc时,您将释放驻留在数组中的对象,因此您的数组现在将具有一个空值,这将导致EXEC ....错误

答案 1 :(得分:4)

第一眼看到你的代码有几个问题:

    Posizione *tempPosition;
    tempPosition = [[Posizione alloc]init];

    tempPosition = [arrayPosizioniMovimento objectAtIndex:i];

在第二行中,您将创建新的Posizione实例,并在此之后将另一个值分配给同一个变量。实际上,这意味着您永远不会使用您创建的实例并导致内存泄漏。要使用数组中的元素,只需编写

即可
Posizione *tempPosition = [arrayPosizioniMovimento objectAtIndex:i];

第二个 - 是以下一行

[tempPosition dealloc];

首先,您应该永远不直接调用此方法,而是发送一个对象-release消息 - 当它的保留计数变为0时,它将自动解除分配。在您的情况下,您不会在该代码中保留tempPosition对象,以便在那里;不需要在此处释放它 - 只需删除该行。

P.S。使用fast enumeration还可以使您的代码更具可读性并且不易出错:

for (Posizione *tempPosition in arrayPosizioniMovimento){
   if(tempPosition.valueX <= valueMinX){
...

答案 2 :(得分:1)

您可以启用Objective-C Exception断点来精确定位该行。

跳出来的东西是

    [tempPosition dealloc];

我不知道该告诉你怎么做。你需要调用release而不是dealloc。

[tempPosition release];

但是我不确定这是如何适合你的代码的其余部分,你在那里分配一个变量,然后立即为它分配另一个值。

我认为你应该删除alloc和dealloc

所以删除:

    //Posizione is my class. It contain a NSString name, 3 float valueX, valueY, valueZ
    Posizione *tempPosition;
    tempPosition = [[Posizione alloc]init];

[tempPosition dealloc];

答案 3 :(得分:0)

Pease显示如何初始化arrayPosizioniMovimento。 如果您将其初始化为arrayPosizioniMovimento = [NSMutableArray arrayWithCapacity:n];,则需要添加[arrayPosizioniMovimento retain];