2010-07-11 5 views
1

Je voudrais assigner une date d'un contrôleur de vue à un autreNSDate assigner problème

-(void) setCurrentDate:(NSDate newDate){ 
    self.currentDate = newDate; 
    [self updateView]; 
} 

Lors du débogage, je vois la valeur currentDate hors de portée et l'application se bloque avec EXC_BAD_ACCESS.

Toute aide sera appréciée.

Répondre

1

Vous devez transmettre le pointeur à la date. Quelque chose comme ceci:

-(void) setCurrentDate:(NSDate* newDate){ 
    [self.currentDate release]; 
    self.currentDate = newDate; 
    [self.currentDate retain]; 
    [self updateView]; 
} 

Bien sûr, votre variable de classe currentDate devrait également être un pointeur NSDate. Ce sera encore mieux si vous utilisez une propriété à la place d'un setter personnalisé.

+1

qui appellerait récursive le poseur. –

+0

Merci, c'est correct, j'utilise déjà une propriété avec synthétiser et relâcher comme il se doit. – Mohammed

+1

@Mohammed: Avez-vous testé cela avant d'accepter? Cela se traduira par '-setCurrentDate:' étant appelé récursivement et finalement tomber en panne avec un 'EXC_BAD_ACCESS' ou similaire. –

0

Eventuellement, vous devez conserver newDate ou le copier, si c'est possible.

Ce que je veux dire:

  1. Vous créez newDate
  2. Vous appelez setCurrentDate
  3. vous fermiez newDate
  4. [auto updateView] essayez de l'utiliser et échoue parce qu'il est déjà sorti.

Vous pouvez également essayer NSZombieEnabled pour attraper ce genre de bugs.

+0

le membre currentDate est créé dans l'événement viewDidLoad et conservé currentDate = [[[NSDate alloc] initWithTimeIntervalSinceNow: 0] retain]; il est également synthétisé Je suis totalement marre parce que tout semble correct. – Mohammed

0

Dans votre nom de méthode, vous utilisez (NSDate date). Vous avez oublié d'inclure le "*", ce qui en fait un pointeur. Le code correct doit être

-(void) setCurrentDate:(NSDate *newDate){ // Notice the star after NSDate 

    self.currentDate = newDate; 
    [self updateView]; 

} 
+0

Merci, je l'ai oublié dans la question, mais il est correct dans le code – Mohammed

+0

Ce serait aussi appel récursivement le setter. –

2

Outre que votre setter devrait prendre NSDate par pointeur (toutes les instances de type classe sont passés par le pointeur en Objective-C), vous appelez récursive le poseur:
self.currentDate = foo résultats dans [self setCurrentDate:foo] être appelé.

Correctement, il devrait regarder par ex. comme celui-ci (en supposant une propriété nonatomic, retain):

- (void)setCurrentDate:(NSDate *)newDate { 
    if (currentDate != newDate) { 
     [currentDate release]; 
     [newDate retain]; 
     currentDate = newDate; 
     [self updateView]; 
    } 
} 

cette méthode nom de rechange différent du poseur de sorte que vous pouvez utiliser le setter synthétisé:

- (void)updateDate:(NSDate *)newDate { 
    self.currentDate = newDate; 
    [self updateView]; 
}