2009-10-09 7 views
1

J'essaie d'exécuter le code ci-dessous, mais il continue à verrouiller mon simulateur après que le "Tick" est écrit sur la console. Il ne sort jamais "Tock" donc je pense qu'il doit faire avec la ligne "NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];" Les IBactions sont activées par des boutons. timer et startTime sont définis dans le .h comme NSTimer et NSDate respectivement. Est-ce que quelqu'un peut me dire ce que je fais mal?NSTimer Troubles

code:

- (IBAction)startStopwatch:(id)sender 
{ 
    startTime = [NSDate date]; 
    NSLog(@"%@", startTime); 
    timer = [NSTimer scheduledTimerWithTimeInterval:1 //0.02 
              target:self 
              selector:@selector(tick:) 
              userInfo:nil 
              repeats:YES]; 
} 

- (IBAction)stopStopwatch:(id)sender 
{ 
    [timer invalidate]; 
    timer = nil; 
} 

- (void)tick:(NSTimer *)theTimer 
{ 
    NSLog(@"Tick!"); 
    NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow]; 
    NSLog(@"Tock!"); 
    NSLog(@"Delta: %d", elapsedTime); 
} 

je suit dans le .h:

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> { 

    NSTimer *timer; 
    NSDate *startTime; 
} 


- (IBAction)startStopwatch:(id)sender; 
- (IBAction)stopStopwatch:(id)sender; 
- (void)tick:(NSTimer *)theTimer; 

@property(nonatomic, retain) NSTimer *timer; 
@property(nonatomic, retain) NSDate *startTime; 

@end 

Répondre

4

Où avez-vous:

startTime = [NSDate date]; 

Vous devez:

startTime = [[NSDate date] retain]; 

Tout ce qui est créé sans alloc, new, init sera automatiquement libéré (principe de base). Donc, ce qui se passe, c'est que vous créez le NSDate, l'assignant à startTime, il est auto-libéré (détruit), alors vous essayez d'appeler timeIntervalSinceNow sur un objet qui a été complètement libéré pour qu'il explose. L'ajout de la retenue a augmenté le nombre de rétention de sorte qu'il reste toujours après la libération automatique. N'oubliez pas de le relâcher manuellement quand vous en avez fini!

+0

Je mis à jour le poste avec mon code .h. Le "nonatomic, retenez" ne devrait-il pas s'occuper du problème de conservation? Est-ce qu'il agit différemment de votre méthode? – SonnyBurnette

+0

Ça devrait être, je ne connais pas trop @properties, mais d'après ce que j'ai pu comprendre, ça devrait l'être. Cependant, dans mes tests, ce n'est pas le cas. Je pense que c'est parce que faire "startTime = [date NSDate];" est en train d'accéder directement à l'objet, sans passer par la propriété setter qui est en train d'être synthétisée (aussi, vous appelez @synthesize, non?). Ma méthode fonctionne cependant: -D – ACBurk

+1

Elle n'accède pas à l'objet, elle affecte directement l'objet à la variable d'instance. C'est là que réside le problème. vous ne traversez pas la propriété. –

3

Pour profiter du @property que vous devez faire: self.startTime = [date NSDate]

+0

DOH! Cela fait parfaitement sens. Merci pour le suivi. – SonnyBurnette

Questions connexes