2010-08-27 13 views
0

Dans ce code, dans la deuxième boucle for, j'obtiens un EXC_BAD_ACCESS si j'utilise un identifiant autre que i et j.EXC_BAD_ACCESS dans la boucle

if (UIDeviceOrientationIsPortrait(deviceOrientation)){ 
    numRows = 4; 
    numCols = 3; 
}else { 
    numRows = 6; 
    numCols = 1; 
} 

for (int row = 0; row < numRows; row++){   
    for (int col = 0; col < numCols; col++) { 
     keysArray[row][col] = [[[keys objectAtIndex:0] retain] autorelease]; 
     if (col < numRows) 
      [keys removeObjectAtIndex:0]; 
    } 
} 

//Here is the crash 

for (int i = 0; i < numRows; i++) { 
    for (int j = 0; j < numCols; j++){ 
     UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom]; 
     b.frame = CGRectMake(i * kKeyGap, j * kKeyGap, 57, 57); 
     [b setImage: [UIImage imageNamed:keysArray[j][i]] 
            forState:UIControlStateNormal]; 


     [self.view addSubview:b]; 
    } 
} 

Pourquoi est-ce que cela causerait une telle erreur? J'ai essayé d'utiliser Modifier tout dans l'étendue pour éviter de manquer un, mais il se bloque toujours.

Merci

+0

Pouvez-vous fournir un exemple et/ou de clarifier ce qui est ou ne provoque pas l'accident? Dans l'exemple, tout ce que vous utilisez est i/j ... – nessence

Répondre

0

Dans votre première boucle vous faites référence keysArray[row][col] dans la deuxième boucle, vous semblez être en utilisant keysArray[col][row] qui lui ferait tomber en panne si numRows et numCols sont différentes

1

Votre ligne:

keysArray[row][col] = [[[keys objectAtIndex:0] retain] autorelease]; 

Je ne suis pas un expert Objective-C ou quoi que ce soit, mais je ne suis pas certain que vous devez AutoRelease cet objet parce que vous ne l'avez pas la mémoire allouée pour ça. Que se passe-t-il lorsque vous essayez de supprimer cette autorelease?

Je soupçonne que lorsque vous AutoRelease l'objet et puis essayez d'affecter la valeur du tableau ici:

[b setImage: [UIImage imageNamed:keysArray[j][i]] 
           forState:UIControlStateNormal]; 

vous obtenez le EXC_BAD_ACCESS. Je peux me tromper, auquel cas j'espère que quelqu'un de plus intelligent que moi peut éclaircir ça. :)

+0

"retenir" signifie que vous en devenez propriétaire, donc vous devriez le libérer. – cobbal