2010-10-29 5 views
0

J'ai lutté avec la meilleure façon de créer, accéder et mettre à jour les valeurs d'un tableau booléen dynamique pour plus d'une semaine maintenant.Objectif C: Quelle est la meilleure façon de créer et d'utiliser un tableau booléen dynamique?

@interface myDelegate : NSObject 
{ 
    NSMutableArray *aShowNote; 
} 
@property (nonatomic, copy) NSMutableArray *aShowNote; 

Voici comment j'initialisées mon tableau:

NSMutableArray *aShow = [[NSMutableArray alloc] init]; 
for (i=0; i < c; i++) 
    [aShow addObject:[NSNumber numberWithBool:false]]; 
self.aShowNote = aShow; 

Cela semble fonctionner OK mais je suis dérouté pourquoi chaque élément est initialisé avec la même adresse.

Mais ce que je l'ai découvert dans mes recherches à ce jour est qu'il semble que vous devez remplacer l'objet si vous souhaitez modifier sa valeur:

myDelegate *appDelegate = (myDelegate *)[[UIApplication sharedApplication] delegate]; 
NSInteger recordIndex = 1; 

NSNumber *myBoolNo = [appDelegate.aShowNote objectAtIndex:recordIndex]; 
BOOL showNote = ![myBoolNo boolValue]; 

[appDelegate.aShowNote replaceObjectAtIndex:recordIndex withObject:[NSNumber numberWithBool:showNote]]; 

mais cette approche semble juste être plus compliqué (et il se bloque aussi).

en raison de l'application Mettre fin exception'NSInvalidArgumentException uncaught 'raison:' - [__ NSArrayI replaceObjectAtIndex: withObject:]: sélecteur non reconnu envoyé à l'instance 0x5b51d00

Les pointeurs pour améliorer ce code (et bien sûr de faire ce travail) serait très apprécié.

Merci

Iphaaw

+1

Sur le problème de toutes les entrées ayant la même adresse: puisque NSNumber est immuable, un seul objet est nécessaire pour une valeur donnée. Pour certaines valeurs communes, il existe des objets préalloués dès le départ.Chaque fois que vous appelez 'numberWithBool: false', il vous renvoie simplement une autre référence à l'instance existante. (BTW, point trivial, mais 'NO' serait plus idiomatique que' false'.) – walkytalky

Répondre

3

le problème est que copy dans une copie de propriété de l'objet assigné. Et la copie crée des objets immuables.

Changer votre propriété à lire: @property (nonatomic, retain) NSMutableArray *aShowNote;


Et je pense qu'il n'y a pas grand-chose à améliorer, de ce que je sais que c'est la voie à suivre si vous voulez un NSArray avec booléens.

+0

merci. Cela l'a réparé! – iphaaw

0

Je ne comprends pas pourquoi chaque élément est initialisé avec la même adresse.

Pourquoi? NSNumbers sont immuables. Le moteur d'exécution n'a besoin que d'un objet NSNumber pour représenter FALSE.

1

Il n'est pas possible de changer la valeur d'un NSNumber. Ce n'est pas une classe mutable.
Ensuite, lorsque vous demandez deux valeurs identiques, le même objet est return.

Dans votre init tableau, pourquoi vous ne pas initialisés directement le tableau pour éviter tout problème de copie:

aShowNote = [[NSMutableArray alloc] init]; 
for (i=0; i < c; i++) { 
    [aShowNote addObject:[NSNumber numberWithBool:false]]; 
} 
+0

merci. C'était la manière simple que je cherchais. – iphaaw

+0

Alors votez et sélectionnez ma réponse! –

2

Pourquoi ne pas utiliser C clair pour ce cas simple?

BOOL *aShow = malloc(sizeof(BOOL)*c); 
for (i=0 ; i<c ; i++) 
    aShow[i] = false; 

Vous venez de rappeler à free(aShow) quand vous avez fini avec elle.

+0

merci. C'était la manière simple que je cherchais. – iphaaw

Questions connexes