views:

58

answers:

5

Hi, i have a problem. When i compile my program there isn't a error but, when i start it these retern with “EXC_BAD_ACCESS”. I looking for the error with the debug and i find it in these method but i don't understand where... Can you help me? Thanks and sorry for the english.

PS:the program enters in the loop sometimes.

-(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;   
}
+1  A: 

You can enable Objective-C Exception breakpoints to pinpoint the line.

On thing that jumps out is

    [tempPosition dealloc];

I'm not sure what to tell you to do. You need to call release not dealloc.

[tempPosition release];

But im not sure how that fits into the rest of your code, where you are allocating a variable then immediately assigning it another value.

I think you should just remove the alloc and dealloc

so delete:

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

and

[tempPosition dealloc];
sylvanaar
A: 

Pease show how do you initialize arrayPosizioniMovimento. If you initialized it like arrayPosizioniMovimento = [NSMutableArray arrayWithCapacity:n]; than you'll need to add [arrayPosizioniMovimento retain];

OgreSwamp
arrayPosizioniMovimento = [[NSMutableArray alloc]init];
zp26
+4  A: 

It looks like it may be the [tempPosition dealloc] call. You're declaring that variable and doing an alloc/init on it but then just assigning it to the object within the array, so the alloc/init is unneeded. When you make the call to dealloc at the bottom you're releasing that object that resides in the array, so your array will now have a null value which will cause the EXEC.... error

Justin
Just as a side note. When the release message is sent to an array it also calls release on each of it's items, so you shouldn't need to explicitly do this for the items within your array.
Justin
+4  A: 

For the 1st glance there're several problems with your code:

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

    tempPosition = [arrayPosizioniMovimento objectAtIndex:i];

Here in the second line you create new Posizione instance and right after that assign another value to the same variable. In effect that will mean that your created instance will be never used and cause memory leak. To use element from array just write

Posizione *tempPosition = [arrayPosizioniMovimento objectAtIndex:i];

The second one - is the following line

[tempPosition dealloc];

First of all you should never call this method directly but rather send an object -release message - it will be deallocated automatically when its retain count becomes 0. In your case you do not retain tempPosition object in that code so there;s no need to release it here - just remove that line.

P.S. Using fast enumeration can also make your code more readable and less error prone:

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