Question

J'ai ce petit code

 NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
 NSNumber *myNumber = [NSNumber numberWithDouble:752.65];

 [myArray addObject:myNumber];

Avec ce code, je stocker des objets dans un tableau. Mais maintenant, j'ai deux objets indépendants les uns des autres.

Si je change myNumber après qu'il a été ajouté au tableau de la valeur à l'intérieur du tableau ne change pas. Comment puis-je archiver cela? J'ai essayé de donner un pointeur uniquement au tableau, mais il ne fonctionne pas.

Était-ce utile?

La solution

Vous ne pouvez pas mettre un variable dans un tableau, et c'est ce que myNumber est: une variable. Une variable est un conteneur, et est donc un réseau; la différence est qu'une variable n'est pas aussi un objet *, comme le tableau est, et vous ne pouvez mettre des objets dans un tableau.

Qu'est-ce que vous passez à addObject: n'est pas la myNumber variable mais l'objet qu'il contient. C'est ce que vous ajoutez au tableau.

Pour ajouter la variable au lieu de l'objet à l'intérieur, vous devez faire addObject:&myNumber, afin de passer un pointeur vers la variable elle-même. Mais cela ne fonctionnera pas, pour deux raisons:

  1. Comme je l'ai mentionné, la variable est pas un objet, et vous ne pouvez ajouter des objets.
  2. Comme il est une variable locale, il périra lorsque les sorties de fonction; alors vous avez un pointeur vers la mémoire morte dans votre tableau. Quand vous allez à accéder tout ce qui est à ce pointeur, votre programme plantait.

Il existe trois solutions qui fonctionnent:

  1. Comme f3lix suggère, créer une classe de numéro mutable et créez votre objet numéro de cette classe au lieu de NSNumber. Vous aurez besoin de remplacer toutes les méthodes primitives de NSValue comme décrit dans la documentation NSNumber .
  2. Remplacer l'objet dans le tableau au lieu de muter il. Bien sûr, cela nécessite d'avoir accès au tableau de partout où vous voudriez changer le nombre.
  3. Créer une classe d'objet de modèle qui a le numéro comme une propriété.

Cette dernière solution est, à mon avis, la bonne. Je doute que vous gérez seulement une liste de numéros; De plus, vous êtes probablement montrant à l'utilisateur une liste de quelque chose qui a le numéro comme une propriété. Modèle dans votre code, et tout devient beaucoup plus simple.

Votre code après avoir remplacé les NSNumbers nus avec des objets du modèle sera quelque chose comme:

MyModelObject *myModelObject = [[[MyModelObject alloc] init] autorelease];
[myModelObject setNumber:[NSNumber numberWithDouble:42.0]];
[myArray addObject:myModelObject];

//Some time later, you decide to change the number.
[[myArray objectAtIndex:idx] setNumber:[NSNumber numberWithDouble:43.0]];
//Or:
for (MyModelObject *obj in myArray) {
    [obj setNumber:1000.0];
}

* Je veux dire des objets de cacao. Le langage C n'appelle tout pointeur, int, etc. un « objet », mais cela est une définition différente.

Autres conseils

Votre problème est que les objets sont NSNumber immuable ; ce qui signifie que vous ne pouvez pas changer leur valeur. Ainsi, afin de changer une valeur que vous devez créer un nouvel objet NSNumber. Par exemple:

myNumber = [NSNumber numberWithDouble:[myNumber doubleValue]+1.0]

Maintenant, bien sûr, vous avez myNumber à différents points objet que celui que vous avez ajouté au tableau. Donc, vous devez mettre à jour le tableau en remplaçant l'objet NSNumber changé:

[myArray replaceObjectAtIndex:0 withObject:myNumber]

Eh bien, cela vous laisse le problème que vous devez stocker l'index en même temps que chaque NSNumber afin de pouvoir mettre à jour le tableau. Ce qui est incovenient si vous voulez passer l'objet NSNumber autour et permettent de modifier la valeur.

Vous pouvez résoudre ce problème en introduisant un objet wrapper que vous enrouler autour NSNumber afin de permettre des mises à jour transparentes ou que vous pouvez créer votre propre classe qui gère votre doubleValue (un peu une classe mutable NSNumber).

Si vous modifiez le pointeur myNumber alors, comme vous l'avez dit, la valeur stockée dans le tableau ne change pas. Cependant, le pointeur stocké dans le tableau est une copie de myNumber, donc si vous changez l'objet MON_NOMBRE pointe vers l'objet que les points d'élément de tableau refléteront ce changement parce qu'il est le même objet.

Ce que vous semblez vouloir faire est de faire le point de tableau à un autre objet (à chaque fois que vous changez myNumber). Vous devrez le faire manuellement en utilisant, par exemple -replaceObjectAtIndex: withObject :, comme ceci:

NSNumber *myNumber = [NSNumber numberWithDouble: 3.141592];
int myNumberIndex = [myArray count];
[myArray addObject: myNumber];

myNumber = ...; //whatever
[myArray replaceObjectAtIndex: myNumberIndex withObject: myNumber];

Qu'est-ce que ce code fait, essentiellement, est stocker l'index de l'objet que vous mettez dans monTableau puis remplacer cet objet par le nouveau.

On dirait que vous voulez quelque chose comme NSPointerArray ...

  

NSPointerArray est probablement l'un des plus puissants de (ces) classes de collections spécialisées. Il spécifie un   Interface de type NSArray, mais permet l'insertion de valeurs nulles (et des pointeurs arbitraires). En outre, en spécifiant certaines options lors de la création d'une instance de   NSPointerArray, vous pouvez configurer votre réseau pour avoir des politiques de gestion de mémoire spécifiques en ce qui concerne les objets stockés à l'intérieur.

     

Vous spécifiez les options de votre instance de NSPointerArray lorsque vous créez à l'aide des méthodes -initWithOptions: ou -initWithPointerFunctions:. Lorsque vous utilisez la méthode   -initWithOptions: `, vous indiquez que le tableau que vous créez obéira aux politiques établies par les options que vous passez comme paramètre. Les options, qui sont spécifiés à l'aide d'un ou, au niveau du bit définir des politiques spécifiques ou des « personnalités » pour le tableau.

et il continue ...

  

Lorsque vous passez cette instance au NSPointerArray, il utilisera alors les fonctions que vous avez définies lorsque des objets sont insérés, supprimés, et ainsi de suite, à la place des conserver la normale, la libération, et d'autres méthodes qui seraient utilisées dans un NSArray normal.

Source (mais je chercherais ailleurs si vous voulez en savoir plus)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top