2009-08-19 7 views
0

J'ai ce que je pense est une erreur étrange, mais bien sûr, je suis relativement nouveau dans le développement de l'iPhone, il est donc possible que ce n'est pas si bizarre après tout. J'ai un tableau (NSMutableArray) d'objets dont je garde la trace (un est ajouté au tableau chaque fois que l'utilisateur touche un bouton) ce que j'essaye de faire est quand le tableau atteint une certaine valeur I ajoutez le nouvel objet au début du tableau, puis supprimez le dernier objet du tableau. Quand je parcours mon code, tout fonctionne, l'objet est supprimé, mais l'application tombe en panne ... le débogueur ne se trouve sur aucune ligne de code lorsque l'application plante et qu'il n'y a plus de boucles ou de minuteurs dans l'application. Je pense à tout ce qui fonctionne.NSMutableArray supprimant l'objet, puis l'application se bloque

est ici le code qui est exécuté juste avant que chaque fois que l'utilisateur touche un bouton d'un objet est ajouté à l'écran et affiche le crash

if([objectArray count] > 10) 
{ 
    MyObject *objectToRemove = [[MyObject alloc] init]; 
    objectToRemove = [objectArray objectAtIndex:10]; 
    [objectArray removeObjectAtIndex:10]; 
    [objectToRemove removeFromSuperview]; 
} 

le principal point de ce code, puis lorsque le le nombre d'objets atteint 10 et l'utilisateur touche à nouveau le bouton le premier objet ajouté a été supprimé et le nouvel objet est affiché. Si je commente la ligne removeObjectAtIndex, tout fonctionne comme prévu, mais le tableau continue à croître.

J'ai également essayé de supprimer l'objet après la suppression de l'UIview et l'application se comporte de la même manière. Si j'essaye de retirer un objet du tableau à un index différent (I.E 3) l'application ne plante pas mais cela ne me donne pas le résultat attendu. mais comme je l'ai dit, le code fonctionne bien et quand je vérifie le compte du tableau avant et après l'exécution de la ligne, la valeur est 11 et 10 respectivement.

Toute aide que vous pouvez fournir serait apprécié,

BWC

Répondre

6

Je ne pense pas que ce fait ce que vous pensez. Aller ligne par ligne.

MyObject *objectToRemove = [[MyObject alloc] init]; 

vous allouez un nouvel objet de type « MyObject

objectToRemove = [objectArray objectAtIndex:10]; 

Vous écrasez votre pointeur MyObject local avec tout ce qui était à l'indice 10 en objectArray Le objectToRemove que vous avez initialement alloué. est maintenant de fuite.

[objectArray removeObjectAtIndex:10]; 

maintenant vous avez supprimé l'objet à l'index 10. Lorsque vous retirez du tableau, il est libéré et son nombre de références est décrémenté. T il peut (ou ne peut pas) le faire être libéré.

[objectToRemove removeFromSuperview]; 

Vous envoyez maintenant un message à l'objet qui était précédemment dans objectArray. Si l'objet a été désalloué par la ligne de code précédente, je m'attendrais à un crash.

En mettant de côté la fuite dans la déclaration, vous pourriez être en mesure de le faire:

 objectToRemove = [[objectArray objectAtIndex:10] retain]; 
     [objectArray removeObjectAtIndex:10]; 
     [objectToRemove removeFromSuperview]; 
     [objectToRemove release]; 

Cela empêcherait l'objet d'être désallouée de sous vous, si c'est la raison pour laquelle l'accident se produit. L'une des façons de déterminer si mon scénario est ce qui se passe est d'activer NSZombies, ce que vous pouvez faire en définissant la variable d'environnement NSZombieEnabled sur YES.

1

Que diriez-vous:

MyObject *objectToRemove = [objectArray objectAtIndex:10]; 
[objectToRemove removeFromSuperview]; 
[objectArray removeObjectAtIndex:10]; 

removeFromSuperview décrémente le conserver une fois sur le nombre objectToRemove. (removeFromSuperview implique qu'il a été ajouté à la vue précédemment et qu'il l'avait conservé et incrémenté son nombre de retenue de un). removeObjectAtIndex va le décrémenter à nouveau. Mais dans cet ordre, vous ne le diffuserez probablement pas quand vous en aurez encore besoin. (Bien sûr, l'ajout au tableau l'a également retenu, donc l'ordre n'est peut-être pas si important).