Comment échanger des valeurs dans NSMutableArray?
Ce morceau de codes segment de la faute sur moi, aucune idée pourquoi? allButtons
est un NSMutableArray
il contient 3 objets, a=0, b=1
a et b sont int
type
if(a != -1 && b!= -1){
//Swap index in "allButtons"
id tempA = [allButtons objectAtIndex:a];
id tempB = [allButtons objectAtIndex:b];
[allButtons replaceObjectAtIndex:a withObject:tempB]; //Seg fault here?????
[allButtons replaceObjectAtIndex:b withObject:tempA];
needLoad = false;
[self setUpButtons];
}
EDIT:
NSMutableArray *allButtons = //fetch the array from Coredata. This work since I display the data onto the screen, plus, [allButtons count] return 3, and a=0, b=1
f(a != -1 && b!= -1){
//Swap index in "allButtons"
[allButtons exchangeObjectAtIndex:a withObjectAtIndex:b];
needLoad = false;
[self setUpButtons];
}
source d'informationauteur Thang Pham
Vous devez vous connecter pour publier un commentaire.
Juste parce que vous avez dit
ne veut pas dire que c'est certainement un NSMutableArray, cela signifie juste que le compilateur pense que ce sera un NSMutableArray.
Si c'est à partir de CoreData, c'est probablement juste une
NSArray
donc les appels de méthode que vous essayez de ne pas travailler - vous obtiendrez unrecongnised sélecteur ou quelque chose comme ça.Vous devrez le convertir en mutable tableau de la première
Le premier appel à
replaceObjectAtIndex:
permettra de libérer l'ancien objet (tempA
), mais cela ne devrait pas causer un seg fault. @Zoran mentionné essayez de vous connecter à laretainCount
de tempA et de vérifier son compte.Aussi pour échanger des éléments dans un tableau, vous devez utiliser
exchangeObjectAtIndex:withObjectAtIndex
au lieu dereplaceObjectAtIndex:withObject
. Il est pris en charge à partir de l'iPhone 2.0.tempA
va être libéré lorsque vous appelez la premièrereplaceObjectAtIndex
. Gardez cela à l'esprit lors de l'appel de ça... je n'ai aucune idée de pourquoi libéranttempA
serait seg fault pour vous, examiner ce que sondealloc
ne peut-être.Vérifier la conserver comte de
tempA
pour vérifier qu'il est en effet dealloc-ed (et non pas simplement rejeté) par l'appel àreplaceObjectAtIndex
comme suit:Si vous voyez conserver un nombre de 1 à ce niveau, alors votre objet
tempA
est dealloc-ed par l'appel àreplaceObjectAtIndex
Veuillez lire et comprendre le Cacao règles sur le propriétaire de l'objet. Notez que vous n'avez pas prétendu droit de propriété sur les objets référencés par tempA et tempB et vous devez donc tenir compte de l'suivantes:
Fondamentalement, la ligne:
Peut causer de tempA à être libéré. Cela signifie que la ligne suivante sera la cause de allButtons pour envoyer conserver un message à un objet non valide, d'où le seg fault. Pour résoudre le problème, vous avez besoin de conserver tempA avant le swap et le libérer ou autorelease après.
NB il est sage d'oublier de conserver compte. Sauf si vous êtes pleinement conscient de la mise en œuvre de tous les objets qui touchent vos objets, vous ne pouvez pas faire d'hypothèses sur ce que l'conserver le comte d'un objet est. Par exemple, il n'y a aucune règle qui dit que la mise en œuvre de NSMutableArray ne jamais conserver ses éléments à la fois.
Utiliser cette méthode passer le appropritate indice