2009-11-07 9 views
2

Ok Je pense que ma compréhension des propriétés de l'objectif c ne correspond peut-être pas à ce que je pensais.Pourquoi ma variable n'est-elle pas affectée

Dans mon programme, j'ai un singleton qui contient ma classe.

Dans ma classe lors de l'initialisation, j'attribue une valeur du singleton à ma propriété. Puis, j'attribue une valeur à une propriété de cette propriété.

Cependant il ne garde pas la valeur et quand je fais une comparaison de la valeur dans le singleton rien n'a changé. Qu'est-ce qui se passe ici? Des idées?

@interface MainGameLoop : NSObject { 
    MapData *mapData; 
} 

@property (retain) MapData *mapData; 

-(id) init 
{ 
    self = [super init]; 
    GlobalVariables *sharedManager = [GlobalVariables sharedManager]; 
    self.mapData = sharedManager.mapData; 
    return self; 
} 

En fonction de ma classe:

œuvres:

sharedManager.mapData.currentPlayer = newCurrentPlayer; 

ne fait rien:

self.mapData.currentPlayer == newCurrentPlayer; 
+0

Je doute de la nécessité d'une classe GlobalVariables. Tout d'abord, vous n'avez pas besoin de tout mettre dans les classes en Objective-C; vous pouvez très bien faire de vraies variables globales. (Et les planquer dans un singleton ne les rend pas moins globaux ou moins variables.) Deuxièmement, pourquoi avez-vous besoin de ce singleton? Pourquoi ne pas avoir l'objet MainGameLoop (que je pourrais renommer en "Game" ou quelque chose) posséder les données de carte purement et simplement? –

+0

Aussi, je conteste que vous avez "un singleton [objet] qui contient ma classe". Il n'y a généralement pas de raison pour qu'un objet possède une classe, à moins que l'objet ne crée dynamiquement des instances d'une classe fournie par l'appelant (comme le font NSObjectController et NSArrayController). Il ressemble plus à votre singleton possède une * instance * de la classe MapData. –

+0

Vous avez raison, il possède juste une instance de la classe. Je l'ai mis dans un singleton parce que je continuais à devoir passer l'instance de mapdata à toutes mes autres classes via leur constructeur et cela commençait à prendre beaucoup de temps. Je doute que c'était la meilleure façon de le faire. – Mel

Répondre

14
self.mapData.currentPlayer == newCurrentPlayer; 

Etes-vous sûr que vous voulez deux signes égaux il ? Cette déclaration est syntaxiquement correcte et évaluera à vrai ou faux.

+3

Ceci est l'une des raisons pour activer l'avertissement "Valeur inutilisée" dans les paramètres de construction. –

+0

wow. C'est marrant quand vous êtes nouveau à quelque chose que vous n'avez tout simplement pas confiance. Toutes sortes d'idées folles me trottaient dans la tête quant à la raison pour laquelle cela se produisait et il s'avéra que c'était quelque chose de fou simple. Merci! – Mel

2

== est un opérateur booléen, tandis que = est un opérateur d'affectation. Comme Dave l'a dit, si vous utilisez une instruction if telle que if (self.mapData.currentPlayer == newCurrentPlayer) {…}, vous voudrez utiliser == car il serait évalué à true ou false, alors que = serait utilisé pour définir la valeur d'une variable, ce qui est ce que je pense essayons de faire.

Si ça peut te consoler, je l'ai fait cette erreur trop de fois pour compter ...

Quelque chose que je fais est d'utiliser NSLog() ou printf() pour vous assurer que chaque étape fonctionne correctement.

Questions connexes